我写了这个函数来检查n2
是否是n1
的子树。我使用递归,但是当我使用两棵树测试它时,它向我显示了错误的答案(预期true
,但它实际上返回了false
)。
我挣扎了一段时间,但仍然不能说出了什么问题。
private Boolean isSubTree(node n1, node n2){
if(n1 == null)
return false;
if(n2 == null)
return true;
if(n1.data == n2.data){
return isSubTree(n1.left,n2.left) && isSubTree(n2.right,n2.right);
}
else
return isSubTree(n1.left, n2) || isSubTree(n1.right, n2);
}
答案 0 :(得分:0)
您的边缘情况不正确。特别是,当n1
和n2
都为空时,则计为匹配子树,但如果只有一个为空,则计为不匹配。
答案 1 :(得分:0)
我认为检查n2的父母是否更容易看看它是否是n1。如果没有,一直继续,直到找到它为止;在这种情况下,您返回true。替代方案是所有直到并包括根的父母都不是n1;在这种情况下,您返回false。换句话说,按照你的方式工作,而不是检查n1的所有可能的孩子和他们的孩子等达到n2。
答案 2 :(得分:0)
有两种情况需要考虑。
答案 3 :(得分:0)
我同意nabau ...如果我们在节点中有父节点的数据那么 n2和n1的根节点是相同的
否则我们可以用n1的每个节点的节点检查n2的根
在java中我们可以比较两个对象是否相同 forEach n1中的所有节点等于n2的根如果有任何节点相等它们是相同的