如果一个二叉树是另一个树的子树

时间:2013-01-12 23:17:50

标签: java binary-tree subtree

我写了这个函数来检查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);
}

4 个答案:

答案 0 :(得分:0)

您的边缘情况不正确。特别是,当n1n2都为空时,则计为匹配子树,但如果只有一个为空,则计为不匹配。

答案 1 :(得分:0)

我认为检查n2的父母是否更容易看看它是否是n1。如果没有,一直继续,直到找到它为止;在这种情况下,您返回true。替代方案是所有直到并包括根的父母都不是n1;在这种情况下,您返回false。换句话说,按照你的方式工作,而不是检查n1的所有可能的孩子和他们的孩子等达到n2。

答案 2 :(得分:0)

有两种情况需要考虑。

  1. 如果子树必须是原始树的一个节点,那么您可以扫描树以查找匹配的子树节点。
  2. 如果子树只需要具有相等的值,那么您需要编写一个递归树相等函数,并在第二个递归函数中将其应用于原始树的所有叶子。

答案 3 :(得分:0)

我同意nabau ...如果我们在节点中有父节点的数据那么 n2和n1的根节点是相同的

否则我们可以用n1的每个节点的节点检查n2的根

在java中我们可以比较两个对象是否相同 forEach n1中的所有节点等于n2的根如果有任何节点相等它们是相同的