【问题标题】:Pre-increment in recursive call递归调用中的预增量
【发布时间】:2019-03-02 20:18:32
【问题描述】:

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

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

【问题讨论】:

  • 你认为++currDepth 会做什么?
  • 在递归调用完成之前将 currDepth 的给定值增加一?与 currDepth++ 相反,它会在之后增加它
  • 太棒了。现在currDepth 在第二次调用traverse 时用作参数,如果第一次将其增加一,那么它的值是多少?
  • 嗯,2,对吧?它从 0 开始,第一次调用将其增加到 1,因此在第二次调用期间它应该是 2
  • 对。当您使用currDept + 1 时,您是否期望同样的事情发生?

标签: java recursion pre-increment


【解决方案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 传递到下一个级别。

【讨论】:

  • 谢谢,我现在知道出了什么问题,我忘了使用 ++currDepth 会改变下一行的值。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2013-11-03
  • 2013-04-12
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多