在这个 DFS 递归函数中,深度 + 1 和深度 ++ 有什么区别?



我正在做leetcode,由于深度++和深度+1的结果完全不同,我陷入了这种困惑!我以前以为他们是一样的。有人能解释一下它们之间的区别吗?

private void dfs(TreeNode root, List<Integer> res, int depth) {
if (root == null) return;
if (res.size() == depth) {
res.add(root.val);
} 
dfs(root.right, res, depth + 1); // depth++ would get different result
dfs(root.left, res, depth + 1);
}

深度++depth=depth+1相同。增量运算符将修改并返回旧depth的副本。

int x = depth;
depth = depth+1;
return x;

depth+1操作将返回表达式的值,而不进行任何修改。

return depth+1;

如果您使用带有赋值的后增量

int a=1;
a = a++;
  • 你可以这样想(a=a++=>a=a,然后a++(
  • 现在,当我们在赋值期间和赋值之后赋值[a=a++]a=1时,a=2

如果您在没有分配的情况下使用后增量

int x=1;
x++;
  • 现在赋值期间x=2,赋值后x=2

post增量运算符varName++使用当前值,然后递增变量,继续执行语句的其余部分。

如果您使用增量运算符++varName,则第一个调用将与depth + 1一样工作,但将使变量保持增量,需要下一次使用它来将其考虑在内:

dfs(root.right, res, ++depth); // increment before using value
dfs(root.left, res, depth); // depth already incremented

尽管由于避免了1次算术运算,这将使代码的执行速度非常快,但代码更难读取,如果添加了更多不希望depth在方法中发生变化的代码,则可能会导致错误。

一些人认为改变方法参数的值是一种糟糕的风格,尽管这种风格准则并没有被普遍接受为最佳实践。

depth + 1depth++与结果相同,但执行方式不同。CCD_ 9将计算结果应用于下一操作。depth++首先对预加法值进行运算,然后加一。