【问题标题】:Is This Statement True (Used to Determine If a Tree is a SubTree of Another)此语句是否为真(用于确定一棵树是否为另一棵树的子树)
【发布时间】:2013-08-18 04:25:17
【问题描述】:

我有两棵二叉树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树相等)。

子树的定义:如果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


【解决方案1】:

我一直在寻找一种算法来检查 T2 是否是 T1 的子树,它需要的时间少于 O(m*n)。

经过一番搜索,我找到了这两个线程:

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 叶子(例如作为空格),然后尝试检查子字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多