你如何通过两个返回语句递归? [JAVA]

时间:2016-02-28 15:48:28

标签: java recursion binary-search-tree

我目前正在尝试实现二进制搜索树形状比较,并且遇到了一行代码问题。

    if(treeStructOne.getHeight() == 1 && treeStructTwo.getHeight() == 1) //Base Case, if both are empty then they must be equal!
    {
        return true;
    }
    if(treeStructOne.getHeight()  != treeStructTwo.getHeight()) //First make sure height is the same, if not, must be unequal
    {
        return false;
    }
        if(treeStructOne.hasLeft()  && treeStructTwo.hasLeft())
        {
            return similar(treeStructOne.getLeft(),treeStructTwo.getLeft());

        }
        if(treeStructOne.hasRight() && treeStructTwo.hasRight()) //PROBLEM IS HERE
        {
            return similar(treeStructOne.getRight(),treeStructTwo.getRight());  
        }        
        return false;

当树1和2上的节点有一个左子节点,但只有树1有一个权限而不是树2时,会出现问题。在检查到它们都已经离开子节点后,它不会运行右边的检查孩子,如果离开是真的。这与递归在java中的工作方式有关吗?

3 个答案:

答案 0 :(得分:4)

如果两个树hasLeft()都返回true,则您的方法将返回if子句。我的猜测是你想要在最后两个if子句中和if子句之后的类似调用中分配结果

return leftSimilar && rightSimilar;

答案 1 :(得分:2)

前两个if会起作用,但是最后一个部分应该捕获p暗示q的条件,左边和右边都是~p或q。换句话说,如果treeStructOne有一个左子树,treeStructTwo有一个左子树,那么检查它们是否相似(返回类似...)

if(treeStructOne.getHeight() == 1 && treeStructTwo.getHeight() == 1) //Base Case, if both are empty then they must be equal!
    {
        return true;
    }
if(treeStructOne.getHeight()  != treeStructTwo.getHeight()) //First make sure height is the same, if not, must be unequal
    {
        return false;
    }
return (treeStructOne.hasLeft() && treeStructTwo.hasLeft()
         ? similar(treeStructOne.getLeft(),treeStructTwo.getLeft())
         : false)
    && (treeStructOne.hasRight() && treeStructTwo.hasRight()
         ? similar(treeStructOne.getRight(),treeStructTwo.getRight())
         : false);

答案 2 :(得分:0)

::__call()语句立即从当前方法返回,即该方法的其余部分将不会被执行。

在您的情况下,您希望在从方法返回之前进行两次递归调用。你可以这样做:

create_invalidation

然后对右侧做同样的事情并以

结束
createInvalidation

但是,对于真正意义上的java,我会在调用方法之后而不是之前进行空检查,从而减少代码重复:

return