递归比较两个二叉搜索树

时间:2014-04-01 16:24:23

标签: java recursion binary-search-tree

我需要比较两个二叉搜索树,看它们是否相等。 我开发了以下使用递归的代码。

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。我一整天都遇到这个问题,对我来说没什么用。我在网上搜索,但没有找到任何与我的代码相关的内容。 有没有办法打破所有嵌套方法并将值返回到第一个方法?

4 个答案:

答案 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) 
}

我会告诉你代码中的几个问题。

  1. root为null时的终止条件(最终总是会发生)。

  2. 在递归调用中返回语句。你总是在最后归还真实。

  3. PS:如果添加NULL检查(在1中说明),则无需在后续递归调用中添加空检查。现在,代码的后半部分将如下所示:

    return compareTrees(n1.left, n2.left) && compareTrees(n1.right, n2.right);