与增加一个时,Java不会为树搜索返回正确的结果

时间:2019-02-18 16:23:57

标签: java binary-tree

希望这将是一个简单的问题。我试图在二叉树上找到给定唯一数字的级别。我的二叉树就是

[1,2,3,null,4,null,5]

我试图检查两个节点的高度是否相同(在本例中为4和5)。我实现了以下解决方案。

public int findNodeHeight(TreeNode root, int nodeValue, int height){
    //if end of tree, exit loop
    if(root == null){
        return -1;
    }
    //if we found the value, return height
    if(root.val == nodeValue){
        return height;
    }

    //check the left
    int left = findNodeHeight(root.left,nodeValue,height++);
    if(left!=-1){
        return left;
    }
    //check the right
    int right = findNodeHeight(root.right,nodeValue,height++);
    if(right!=-1){
        return right;
    }

    return -1;
}

但是,这不起作用,它返回5的高度2(正确)和4的高度1(错误)。但是,如果我将++运算符更改为

height+1 

如下:

public int findNodeHeight(TreeNode root, int nodeValue, int height){

    if(root == null){
        return -1;
    }

    if(root.val == nodeValue){
        return height;
    }

    //check the left
    int left = findNodeHeight(root.left,nodeValue,height+1);
    if(left!=-1){
        return left;
    }
    //check the right
    int right = findNodeHeight(root.right,nodeValue,height+1);
    if(right!=-1){
        return right;
    }

    return -1;
}

该解决方案现在可以工作了。为什么在方法调用中使用++运算符是错误的?

谢谢!

3 个答案:

答案 0 :(得分:4)

原因是当您传递height时,该方法将以height++的值执行,然后height的值增加1。

height++是一个后递增运算符,它将在语句执行后 内将height的值仅增加1。 ++height是一个预递增运算符,它将在执行语句之前height的值增加1。

如果在height上使用pre-increment运算符,在根本没有进行第二个findNodeHeight调用的情况下,它可能会很好地工作,但是在第二个{{1进行了}}调用,因为它将在第二次调用中更新findNodeHeight的值。因此,建议使用height,以防它提供正确的结果,因为增量运算符可能不会总是提供正确的结果。

答案 1 :(得分:2)

在这种情况下,您不能在方法调用 中使用++,因为var++递增var,但它返回原始 var,这意味着您只需传递var。相反,如果您使用++var,它将同时增加var并传递新增加的值。

答案 2 :(得分:2)

这是由于

height++

返回高度和高度,并将高度增加1和

height+1

只返回height + 1,而不会增加高度,这也是一个问题。