为了账号安全,请及时绑定邮箱和手机立即绑定

递归调用中的预增量

递归调用中的预增量

陪伴而非守候 2021-10-13 16:04:24
我正在解决这个 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 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

让我们说 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到下一个级别。


查看完整回答
反对 回复 2021-10-13
  • 1 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信