鉴于两棵树,你怎么发现其中一棵树是另一棵树的子树?

时间:2012-08-27 17:27:55

标签: algorithm data-structures tree

鉴于两棵树,你怎么发现其中一棵树是另一棵树的子树? 为此提供最佳算法......并给出您已回答的顺序......

3 个答案:

答案 0 :(得分:5)

首先想到的是遍历一棵树,看看它的任何一个树是否是另一棵树的头。然后反转。

如果你知道每棵树的高度,你可能会弄清楚哪棵树可能是另一棵树的子树。

如果您了解树木的其他细节或特征(排序与否,平衡或不平衡),您可以使用这些特征提出更快的算法。

答案 1 :(得分:0)

这是我们可以做的:假设我们有一个名为isSubSet的函数获取两棵树的根。另一方面,我们有一个名为isIdentical的函数,它检查两棵树是否相同。

假设我们想要查看树S是否是树T的子集。如果T和S相同,则它们是,否则我们通过再次调用isSubset函数来经历S.但是这次我们发送T->左和S为左子树T和T->右和S为右子树S.

您可以在here中找到代码和更多信息。

答案 2 :(得分:0)

假设你有双向树,你应该简单地调用两次这个方法,复杂度将是O(k),其中k = n + m,其中n和m - 两棵树的高度。

isSubtree(Node n1, Node n2){
   while(n2.parent != null){
      if(n2.parent == n1){
         return true;
      }
      n2=n2.parent;
   }
   return false;
}

如果您记得访问过的父节点,您可以做得更好:

isParent(Node n1, Node n2){
   Set<Node> parents = new HashSet<Node>();
   parents.add(n1);
   parents.add(n2);
   while(n1.parent != null || n1.parent != null){
        if (parents.contains(n1.parent)){
            n1 is subtree of n2
        }
        if (parents.contains(n2.parent)){
            n2 is subtree of n1
        }
       parents.add(n1.parent);
       parents.add(n2.parent);
       n1=n1.parent;
       n2=n2.parent;
   }
   not a subtrees
}