【问题标题】:Proving that one binary tree is a subtree of another证明一棵二叉树是另一棵二叉树的子树
【发布时间】:2015-12-20 04:08:11
【问题描述】:

假设您有两棵二叉树,并且您想知道其中一棵是否是另一棵的子树。一种解决方案是获取两棵树的中序和前序遍历,并检查候选子树的遍历是否是另一棵树的相应遍历的子串。我读了几篇关于这个解决方案的帖子。一个discussion 表明中序和前序遍历都是必要的。有人可以解释为什么它们就足够了吗?为什么如果tree2的中序和前序遍历是tree1的子串,那么tree2就是tree1的子树?

【问题讨论】:

    标签: algorithm tree tree-traversal


    【解决方案1】:

    问: 一次讨论表明,中序遍历和前序遍历都是 必要的。有人可以解释为什么它们就足够了吗?

    因为一个简单的事实是,可以唯一地从这两个遍历(或中序和后序)中重建二叉树。检查这个例子:

      Inorder  : [1,2,3,4,5,6]
      Preorder : [4,2,1,3,5,6]
    

    从预购中,您知道 4 是树的根。从inorder可以判断出左右子树,从这一点开始递归进行:

                     4
                   /   \
      Left subtree       Right subtree
      Inorder : [1,2,3]  Inorder : [5,6]
      Preorder: [2,1,3]  Preorder: [5,6]
    

    在这篇优秀的文章中查看更多详细信息: Reconstructing binary trees from tree traversal。由于组合在一起的树的这两个序列化(遍历实际上将树序列化为字符串)对于二叉树来说必须是唯一的,因此当且仅当这些遍历是其他两个序列化的子字符串时,我们才能得到一棵树是另一棵树的子树。

    【讨论】:

      【解决方案2】:

      人们同意二叉树可以通过左/右关系表示其节点上的顺序。这意味着左边部分在右边部分之前。如果顺序相同,您可以称树等效。因此,按顺序字符串表示顺序,如果要检查等价性,则仅按顺序检查就足够了(根据定义)。 但是当你想检查树的完全相等时,我们必须找到我们如何区分等价树的方法。例如它可以是级别顺序检查。但是对于子树的级别顺序不合适,因为子树的级别顺序字符串被拆分了。对于预购,您在树的其他部分之前从根目录中走子树。

      假设等价的树不相等,那么在前序中遍历一切都将相等,直到第一个不同。可能会发生 2 种情况。

      1) 一棵树的节点值与另一棵不同。这意味着预购字符串不同,因为您按预购顺序遍历树。

      2) 孩子签名(没有孩子,只有左边,只有右边,两个孩子)不同。但是在这种情况下很容易理解,中序会改变,树不等价,这与条件相矛盾。

      请注意,这仅适用于所有节点都是唯一的。如果你有像“a”这样的所有节点,那么无论你怎么走,你的字符串总是“aa...a”。所以你必须以某种方式区分节点,而不仅仅是“值”。

      【讨论】:

        猜你喜欢
        • 2021-08-24
        • 1970-01-01
        • 2014-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多