递归调用前增加

时间:2018-09-27 01:27:18

标签: java recursion pre-increment

我正在解决这个leetcode问题https://leetcode.com/problems/binary-tree-right-side-view/description/

以下代码正常工作。

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List <Integer> ans = new LinkedList<>();
        if (root == null) return ans;
        traverse(root, ans, 0);
        return ans;
    }

    public void traverse(TreeNode root, List<Integer> ans, int currDepth){
        if (root == null) return;

        if (ans.size() == currDepth) ans.add(root.val);
        traverse(root.right, ans, currDepth + 1);
        traverse(root.left, ans, currDepth + 1);
    }
}

但是,在最后2次递归调用中,如果我将行更改为

 traverse(root.right, ans, ++currDepth);
 traverse(root.left, ans, ++currDepth);

代码失败,为什么会这样?这两个版本不应该等效吗?

1 个答案:

答案 0 :(得分:1)

让我们说currDepth = 0

在您的第一个版本中,两个递归调用将如下所示:

traverse(root.right, ans, 1);
traverse(root.left, ans, 1);

这是正确的,因为您希望两个递归调用都进入下一个级别。

在第二个版本中,它看起来像这样:

traverse(root.right, ans, 1);
traverse(root.left, ans, 2);

这意味着第一个递归调用可以正常工作,但是第二个递归调用是错误的(跳过一个级别)。

为什么?您更改了您的currDepth参数。您的代码的第一个版本不会更改它。它将currDepth + 1传递到下一个级别。