Java 如果一棵二叉树是另一棵树的子树

Java 如果一棵二叉树是另一棵树的子树,java,binary-tree,subtree,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){

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

您的边缘案例不正确。特别是,当
n1
n2
都为空时,则将其视为匹配子树,但如果只有一个为空,则将其视为不匹配。

我认为更容易检查n2的父级,以查看它是否为n1。如果没有,一直走到找到为止;在这种情况下,返回true。另一种选择是,根之前的所有父代(包括根)都不是n1;在这种情况下,返回false。换言之,工作的方式,而不是检查所有可能的儿童和他们的孩子等N1的到达N2。

< P>有两个要考虑的情况。

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

  • 我同意纳博的观点。。。如果节点中有父节点的数据,最好检查天气n2和n1的根节点是否相同

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

    在java中,我们可以比较两个对象是否相同

    n1中的每个all节点都等于n2的根如果有任何节点等于,则它们是相同的

    欢迎使用堆栈溢出!要求人们发现代码中的错误是没有效率的。您应该使用调试器(或添加打印语句)来隔离问题,然后构造一个。是的,同意您的看法。感谢您提醒我这一点。这段代码实际做的是确定是否可以通过删除第一棵树的分支来从第一棵树创建第二棵树。但是,它允许从树中删除分支,这意味着它不是真正的子树。n1是较大的树,n2是需要检查的子树。当n2为空时,可以将其视为n1的子树。是吗?是的,我误读了这个问题,这个答案是错误的。如果我想到另一个答案,我会把它贴出来。谢谢尼尔。我非常喜欢你的回答。实际上,我的意思是你的回答中的第二种情况——检查两棵树的值是否相等。但我不能理解的是:为什么我的函数不足以用作相等函数(我已经检查了n1.data==n2.data)。希望你的回应。