我正在阅读的一本书声称检查二叉树B
是否是二叉树A
的子树的一种方法是构建inorder
和{{1}两个树的字符串(表示每棵树的inorder和preorder遍历的字符串),并检查preorder
是否为inorder_B
和 inorder_A
的子字符串是preorder_B
的子字符串。请注意,它声称您必须检查两者 inorder 和预订字符串的子字符串匹配。
是否真的有必要检查两者 inorder和preorder字符串的子字符串匹配?检查两者都不够吗?有人可以提供一个证明我错的例子(即证明书中的权利要求)吗?我无法想出一个例子,其中两棵树不相等,但是预订或顺序字符串匹配。
答案 0 :(得分:6)
考虑两个节点树,其中A和B为节点。树一个以B为根,A为左子。树二以A为根,B为右子。 inorder遍历匹配但树木不同。
答案 1 :(得分:1)
我认为如果树不是二叉搜索树而是普通二叉树,则需要两者。任何节点集都可以是预订符号。假设有一个二叉树a,b,c,d,e,f,g,h,你的子树是cdef。您可以使用子树cde和另一个子树fg创建另一个树。没有办法知道差异。
如果它是二叉搜索树,但你不需要有顺序。
顺便提一下,这是一个有趣的算法问题:给定一个预编号符号,找到满足它的二叉树的数量。
答案 2 :(得分:0)
作为user1952500答案的补充:如果它是二元搜索树,则只有预订或仅后序才能使其唯一,而只能按顺序排列。例如:
5
/ \
3 6
inorder:3-5-6 但是,另一个二叉搜索树可以具有相同的顺序:
3
\
5
\
6
另外,我相信preorder + inorder + string_comparison只能检查两棵树是否相同。它无法检查树是否是另一棵树的子树。要查看示例,请参阅 Determine if a binary tree is subtree of another binary tree using pre-order and in-order strings
答案 3 :(得分:0)
使用sentinel进行前序遍历以表示空节点就足够了。 我们可以使用这种方法来序列化/反序列化二叉树。这意味着二叉树与其带有标记表示的预订序之间存在一对一的映射。