【发布时间】:2013-08-18 04:25:17
【问题描述】:
我有两棵二叉树T1和T2,它们都是字符树,也就是说:
struct TreeNode
{
char data;
TreeNode* left;
TreeNode* right;
TreeNode(const char d, TreeNode* const lptr = NULL,
TreeNode* const rptr = NULL)
: data(d), left(lptr), right(rptr){}
};
如果PreOrder2是PreOrder1的子串,InOrder2是InOrder1的子串,那么T2是T1的子树。
以上说法属实吗?
树相等的定义:如果T1和T2具有完全相同的数据值AND分布,则T1 == T2,否则T1 != T2(NULL树相等)。
子树的定义:如果T1中至少有一个节点N1表示N1 == T2,那么T2就是T1的子树。
基本上,我不是在谈论节点地址的等价性;我说的是树的数据值和分布。
== 编辑 ==
我认为这不是真的。 T1 中可能有两个子树,其中一个具有与T2 相同的 PreOrder,另一个具有与T2 相同的 InOrder。
现在我的问题变成了:有没有一种简单的方法可以使用遍历来确定T2 是否是T1 的子树?
== 编辑 ==
使陈述为假的典型例子:
T1:
A
B C
C B
D D
T2:
B
C D
另一个 T1:
A
A A
B B C
C D B
D C D
【问题讨论】:
-
我认为带括号的 InOrder 即 (LSR) (left, self, right) 可用于确定子树的存在。我明天得考虑一下:)
标签: binary-tree subtree inorder preorder