我正在研究这个leetcode问题:
https://leetcode.com/problems/maximum-depth-of-binary-tree/
给定二叉树,找到它的最大深度。
最大深度是从根节点到最远叶节点的最长路径上的节点数。
工作代码:
public class Solution {
public int maxDepth(TreeNode root) {
if(root == null)
return 0;
int left = maxDepth(root.left);
int right = maxDepth(root.right);
if(left > right)
return left + 1;
else
return right + 1;
}
}
非工作代码:
public class Solution {
int left = 0;
int right = 0;
public int maxDepth(TreeNode root) {
if(root == null)
return 0;
left = maxDepth(root.left);
right = maxDepth(root.right);
if(left > right)
return left + 1;
else
return right + 1;
}
}
有人可以解释为什么一个人无法工作吗?递归伤害了我的头脑。
答案 0 :(得分:4)
在您说过的第一个示例中,left
和right
是maxDepth
中的局部变量,因此每次致电至maxDepth
都有自己的私人副本,其他maxDepth
的来电无法更改。
在第二个示例中,left
和right
是实例字段,因此对该实例的maxDepth
的所有调用都将共享。因此,当maxDepth
调用自己时,它会覆盖任何包含调用的left
和right
中的值。例如,这里:
left = maxDepth(root.left);
right = maxDepth(root.right);
...第一个调用返回left
的值,然后第二个调用覆盖,因为第二个调用也执行left = maxDepth(root.left);
。此外,如果您最终进一步递归(可能会如此),则left
和 right
都会被覆盖。