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;
}
}