鉴于两棵树,你怎么发现其中一棵树是另一棵树的子树? 为此提供最佳算法......并给出您已回答的顺序......
答案 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
}