此语句是否为真(用于确定树是否是另一个树的子树)

时间:2013-08-18 04:25:18

标签: binary-tree subtree inorder preorder

我有两个二叉树T1T2,它们都是字符树,这意味着:

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){}

};

如果PreOrder2PreOrder1的子字符串,而InOrder2InOrder1的子字符串,那么T2T1的子树

以上陈述是否属实?

树的定义相等:如果T1T2具有完全相同的数据值AND分布,则T1 == T2,否则T1 != T2(NULL树相等)。< / p>

SubTree的定义:如果N1 T1中至少有一个节点N1 == T2 T2,那么T1T1的子树。

基本上,我不是在讨论节点地址的等价性;我在谈论树的数据值和分布。

==编辑==

我认为这不是真的。 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}}

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)然后尝试检查子字符串。