Algorithm 使用前序和顺序字符串检查子树

Algorithm 使用前序和顺序字符串检查子树,algorithm,binary-tree,tree-traversal,Algorithm,Binary Tree,Tree Traversal,我正在读的一本书声称,检查二叉树B是否是二叉树A的子树的一种方法是构建两棵树的inorder和preorder字符串(表示每棵树的inorder和preorder遍历的字符串),并检查inoorder\u B是否是inoorder\u a的子字符串,以及preorder\u B是否是preorder\u a的子字符串。请注意,它声明您必须同时检查序和前序字符串上的子字符串匹配 是否真的有必要检查序内和序前字符串上的子字符串匹配?检查一下就够了吗?有人能举个例子证明我错了吗(即证明书中的主张是正确

我正在读的一本书声称,检查二叉树
B
是否是二叉树
A
的子树的一种方法是构建两棵树的
inorder
preorder
字符串(表示每棵树的inorder和preorder遍历的字符串),并检查
inoorder\u B
是否是
inoorder\u a
的子字符串,以及
preorder\u B
是否是
preorder\u a
的子字符串。请注意,它声明您必须同时检查序前序字符串上的子字符串匹配


是否真的有必要检查序内和序前字符串上的子字符串匹配?检查一下就够了吗?有人能举个例子证明我错了吗(即证明书中的主张是正确的)?我无法给出一个示例,其中两棵树不相等,但前序或无序字符串匹配。

将两棵节点树中的A和B视为节点。树一的根是B,左子是A。树2的根是A,右子是B。顺序遍历匹配,但树不同。

如果树不是二叉搜索树而是普通二叉树,我认为您需要两者。任何一组节点都可以是前序表示法。假设有一棵二叉树a,b,c,d,e,f,g,h,你的子树是cdef。可以使用子树cde和另一子树fg创建另一棵树。没有办法知道区别

如果它是一个二叉搜索树,那么你不需要索引


顺便说一句,这里有一个有趣的算法问题:给定一个前序符号,找到满足它的二叉树的数量。

作为对user1952500答案的补充:如果它是一个二叉搜索树,只有前序或后序可以使它唯一,而只有inorder不能。例如:

  5
 / \
3   6
顺序:3-5-6 但是,另一个二进制搜索树可以具有相同的顺序:

3
 \
  5
   \
    6
另外,我相信preorder+inoorder+string_比较只能检查两棵树是否相同。它无法检查一棵树是否是另一棵树的子树。要查看示例,请参阅

用sentinel表示空节点的预序遍历就足够了。
我们可以使用这种方法来序列化/反序列化二叉树。这意味着在二叉树和它的前序之间有一对一的映射,并带有哨兵表示

为了完整性,一个前序不够的例子:树1是
1-2-3
以2为根,树2是
1-3
以1为根。啊。。。在这里,我不能给出一个简单的例子。如果你添加标点符号并显示
null
指针,看起来你可以只使用一次遍历,不是吗?例如,如果您将每个节点表示为
null
()
,则第一个树是
(B A null)
,第二个树是
(A null B)
,因此没有歧义。@JoshuaTaylor然后您会遇到3-3(左倾)和3-3(右倾)的问题@Cheng由于标点符号,情况并非如此。树将是(在(值左-右)表示法中):(3(3 null)null)和(3 null(3 null))。没有歧义。只做水平顺序遍历怎么样?这只是一次而不是两次遍历。我并不想否定这个问题。以防万一,您只是在寻找有效的遍历。谢谢您的建议。事实上,下一节将给出一个更有效的算法,使用级别顺序遍历。这样就避免了必须构建pre/inoder字符串,因为随着树的大小的增长,这些字符串的伸缩性不会太好。