Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java测试两个二叉树是相同的_Java_Binary Tree - Fatal编程技术网

Java测试两个二叉树是相同的

Java测试两个二叉树是相同的,java,binary-tree,Java,Binary Tree,更新: 最好的解决办法应该是: public boolean isSameTree(TreeNode p, TreeNode q) { if(p==null&&q==null) return true; if(p==null||q==null) return false; return isSameTree(p.left, q.left)&&isSameTree(p.right, q.right)&&(p.val==q.

更新: 最好的解决办法应该是:

public boolean isSameTree(TreeNode p, TreeNode q) {

    if(p==null&&q==null) return true;
    if(p==null||q==null) return false;

    return isSameTree(p.left, q.left)&&isSameTree(p.right, q.right)&&(p.val==q.val);
}

更新: 谢谢大家,我知道你们告诉我的其他解决方案,但我的问题是为什么我的解决方案不起作用。是因为我忽略了一些返回值吗?谢谢大家!


我写了一个代码来确定两个二叉树是否相同,我使用递归方法来搜索树,但是这个代码有时不起作用,你能帮我弄清楚吗

非常感谢! 代码如下:

/*Definition for a binary tree node.
  public class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;
  TreeNode(int x) { val = x; }
*/

public boolean isSameTree(TreeNode p, TreeNode q) {
    if(p!=null){
        if(q!=null&&p.val==q.val){
            isSameTree(p.left, q.left);
            isSameTree(p.right, q.right);
        }
        else return false;
    }else{
        if(q!=null) return false;
    }
    return true;
}
输入: [10,5,15] [10,5,空,空,15] 输出: 真的 预期:
false

您只是为子树调用isSameTree,但没有检查它们的返回值。简明正确的版本:

public boolean isSameTree(TreeNode p, TreeNode q) {
   if (p == q) { //Will accept null == null
      return true;
   }
   return p != null && q != null && p.val == q.val && 
      isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}

另外,@duffymo不正确地指出您需要使用.equals()而不是==。您正在比较原语val。

我假设您有一个get方法来检索数据。您可以解决的一个方法是让isSameTree方法接受空值,然后进行比较

    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p!=null){
            if(q!=null&&p.val==q.val){
                if(!isSameTree(p.left, q.left)) return false;
                if(!isSameTree(p.right, q.right)) return false;
                return true;
            }
            else return false;
        }else{
            if(q!=null) return false;
        }
        return true;
    }
public boolean isSameTree(TreeNode p, TreeNode q) {

        if (p == q) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }

        return p.get().isSameTree(q.get()) &&
               isSameTree(p.left(), q.left()) &&
               isSameTree(p.right(), q.right());
    } 
另一种方法是:

public boolean isSameTree(TreeNode p, TreeNode q) 
    {

        if (p == null && q == null)
            return true;


        if (p != null && q != null) 
            return (p.get == q.get
                    && isSameTree(p.left, q.left)
                    && isSameTree(p.right, q.right));


        return false;
    }

如果您当前的输出与所需的输出不匹配,并且您不知道原因,那么是时候开始调试了。如果您不确定如何执行此操作,请查看:。它不会解决您的直接问题,但它会提供您可以遵循的步骤,这些步骤应该可以帮助您自己解决问题,或者即使这样做不成功,那么至少可以帮助您更好地隔离您的问题,以便您的问题更集中,更容易回答。isSameTree()有一个返回值。不要忽略它。@duffymo可以安全地使用==作为intSure,但这些是TreeNode实例,而不是int。@duffymo在比较x.val时,如果x是TreeNode,则访问int值val,并且==对于与另一个int进行比较是有效的。对于不访问val的情况,将比较TreeNodes变量。但是,由于他们正在将p和q变量与null进行比较,因此他们正在检查变量是否具有null引用。如果他们试图比较p==q的对象相等性(对象内的相等值),那么这将是错误的。他们和我的答案都不是这样,所以我们的答案是有效的。如果你有C语言经验,可以把变量当作指针。这个解决方案是不正确的。在我发表评论时,代码是:if(!isSameTree(p.left,q.left))返回false;如果(!isSameTree(p.right,q.right))返回true;如果右子树不相等,则不应返回true。p==q check不是有效的检查,因为这是我们试图解决的实际问题。如果它们都引用相同的对象,则它们在逻辑上是等价的。他们没有具体说明是否需要一个有保证的深度比较。因此,我选择了更有效的解决方案。这与我们如何搜索无关。“如果它们引用同一对象”。好!这不是我们要解决的问题吗?这不是实际的问题吗?如果我们知道p==q或者不知道,那么就没有什么eft需要解决。所有其他if语句都是冗余的,请解释它们如何引用相同的对象(在我的代码中为null)而不相等。当两个节点具有相同的数据并且两个节点的左、右节点都携带相同的数据时,它们将引用相同的对象。在您的代码中已经隐式地处理了null情况检查p==q是OP试图解决的实际问题
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
   if (p == null && q == null) 
        return true; 


    if (p != null && q != null)  
        return (p.val == q.val 
                && isSameTree(p.left, q.left) 
                && isSameTree(p.right, q.right)); 


    return false;  
}
}