我有两个二叉树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树相等)。< / p>
SubTree的定义:如果N1
T1
中至少有一个节点N1 == T2
T2
,那么T1
是T1
的子树。
基本上,我不是在讨论节点地址的等价性;我在谈论树的数据值和分布。
==编辑==
我认为这不是真的。 T2
中可能有两个子树,其中一个与T2
具有相同的PreOrder,另一个与T2
具有相同的InOrder。
现在我的问题变成:是否有一种简单的方法可以确定T1
是否是使用遍历的 A
B C
C B
D D
子树?
==编辑==
将语句设为false的典型示例:
T1:
B
C D
T2:
A
A A
B B C
C D B
D C D
另一个T1:
{{1}}
答案 0 :(得分:0)
我一直在寻找一种算法来检查T2是否是一个小于O(m * n)的T1子树。
经过一番搜索,我找到了这两个主题:
Determine if a binary tree is subtree of another binary tree using pre-order and in-order strings
checking subtrees using preorder and inorder strings
看看这些,实际上可能只使用预订和按顺序字符串找到一个子树。有趣的是,他们也在讨论子树的冲突定义。
无论如何,我还没有亲自测试这个方法,但是你试试这个怎么样?:
在预订和顺序遍历中将树T1和T2展平成字符串(就像我们在聊天中谈到的那样),但这次也包括字符串中的每个NULL leaves (例如, whitespaces)然后尝试检查子字符串。