递归调用中的预增量

我正在解决这个 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);

代码失败,为什么会发生这种情况?两个版本不应该是等价的吗?


陪伴而非守候
浏览 129回答 1
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到下一个级别。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java