algorithm - 证明一棵二叉树是另一棵的子树

标签 algorithm tree tree-traversal

假设你有两棵二叉树,你想知道一棵是否是另一棵的子树。一种解决方案是获取两棵树的中序和前序遍历,并检查候选子树的遍历是否是另一棵树相应遍历的子串。我阅读了几篇关于此解决方案的帖子。一discussion表明中序和前序遍历都是必要的。有人可以解释为什么它们就足够了吗?为什么如果 tree2 的中序和前序遍历是 tree1 的子串,那么 tree2 是 tree1 的子树?

最佳答案

Q: One discussion shows that inorder AND preorder traversal are both necessary. Can someone explain why they are sufficient?

因为一个简单的事实,即可以从这两个遍历(或中序和后序)中唯一地重建一棵二叉树。检查这个例子:

  Inorder  : [1,2,3,4,5,6]
  Preorder : [4,2,1,3,5,6]

根据预序,您知道 4 是树的根。从中序可以确定左右子树,从这里开始递归:

                 4
               /   \
  Left subtree       Right subtree
  Inorder : [1,2,3]  Inorder : [5,6]
  Preorder: [2,1,3]  Preorder: [5,6]

在这篇出色的文章中查看更多详细信息: Reconstructing binary trees from tree traversal .由于组合在一起的树的这两个序列化(遍历实际上将树序列化为字符串)对于二叉树来说必须是唯一的,因此当且仅当这些遍历是其他两个序列化的子串时,我们得到一棵树是另一棵树的子树。

关于algorithm - 证明一棵二叉树是另一棵的子树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32729428/

相关文章:

c - C中的快速排序实现

mysql - SQL节点路径重构

algorithm - 如何检测某个范围是否(部分)位于另一个范围内?

c# - 如何删除 roslyn 语法树中的标记。例如从属性中删除虚拟关键字标记?

c# - 在 C# 中遍历对象树

c# - 如何使用一些多边形裁剪算法找到多边形的总面积和质心?

tree - 哪些应用程序使用 R-Trees?

algorithm - 遍历二叉树的最小代价是多少

javascript - 使用 Javascript 遍历 JSON 以构建父子输出

c++ - 位扩展字节数组