我需要比较两个二叉搜索树,看它们是否相等。 我开发了以下使用递归的代码。
private boolean compareTrees(BinaryTreeNode n1, BinaryTreeNode n2)
{
if(n1.getNodeData() != n2.getNodeData())
return false;
else
{
if(n1.left != null && n2.left != null)
compareTrees(n1.left, n2.left);
if(n1.right != null && n2.right != null)
compareTrees(n1.right, n2.right);
}
return true;
}
问题是如果两个节点不相等,该方法将返回false但因为我使用递归,无论如何,返回值都将被覆盖为true。我一整天都遇到这个问题,对我来说没什么用。我在网上搜索,但没有找到任何与我的代码相关的内容。 有没有办法打破所有嵌套方法并将值返回到第一个方法?
答案 0 :(得分:4)
您需要返回子树比较的结果:
boolean b1, b2;
if(n1.left != null && n2.left != null)
b1 = compareTrees(n1.left, n2.left);
if(n1.right != null && n2.right != null)
b2 = compareTrees(n1.right, n2.right);
return b1 && b2;
但为什么不事先处理null
?
private boolean compareTrees(BinaryTreeNode n1, BinaryTreeNode n2)
{
if (n1 == null || n2 == null)
return n1 == n2; // i.e. both null
if (n1.getNodeData() != n2.getNodeData())
return false;
return compareTrees(n1.left, n2.left) && compareTrees(n1.right, n2.right);
}
答案 1 :(得分:0)
我会改变顺序:
private boolean compareTrees(BinaryTreeNode n1, BinaryTreeNode n2)
{
boolean equalLeft = false;
boolean equalRight = false;
if(n1.getNodeData() == n2.getNodeData())
{
if(n1.left != null && n2.left != null){
equalLeft = compareTrees(n1.left, n2.left);
} else{
equalLeft = true;
}
if(n1.right != null && n2.right != null){
equalRight = compareTrees(n1.right, n2.right);
} else{
equalRight = true;
}
return equalLeft && equalRight;
} else{
return false;
}
}
答案 2 :(得分:0)
尝试面对避免空值的问题,并使用equals()方法代替==比较节点。我应该这样做:
private boolean compareTrees(BinaryTreeNode n1, BinaryTreeNode n2){
//avoid nulls :TDD
if (n1==null && n1==n2)
return true;
if ((n1==null && n2!=null) || (n2==null && n1!=null))
return false;
//ensure logic without nulls, comparing with equals() method
boolean areEquals = n1.getNodeData().equals(n2.getNodeData());
//compare left
areEquals = areEquals && compareTrees(n1.left, n2.left);
//if still equals, compare right
if(areEquals) areEquals = areEquals && compareTrees(n1.right, n2.right);
return areEquals;
}
答案 3 :(得分:0)
实际上,您的代码可能会缩减为:
private boolean compareTrees(BinaryTreeNode n1, BinaryTreeNode n2)
{
if(n1==null || n2==null) return n1==n2;
return (n1.getNodeData()==n2.getNodeDate()) && compareTrees(n1.left, n2.left) && compareTrees(n1.right, n2.right)
}
我会告诉你代码中的几个问题。
root为null时的终止条件(最终总是会发生)。
在递归调用中返回语句。你总是在最后归还真实。
PS:如果添加NULL检查(在1中说明),则无需在后续递归调用中添加空检查。现在,代码的后半部分将如下所示:
return compareTrees(n1.left, n2.left) && compareTrees(n1.right, n2.right);