这两个代码之间的区别在于找到二叉树的最大深度?

时间:2015-10-19 03:20:46

标签: java algorithm recursion tree

我正在研究这个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;
    }
}

有人可以解释为什么一个人无法工作吗?递归伤害了我的头脑。

1 个答案:

答案 0 :(得分:4)

在您说过的第一个示例中,leftrightmaxDepth中的局部变量,因此每次致电maxDepth都有自己的私人副本,其他maxDepth的来电无法更改。

在第二个示例中,leftright是实例字段,因此对该实例的maxDepth的所有调用都将共享。因此,当maxDepth调用自己时,它会覆盖任何包含调用的leftright中的值。例如,这里:

left = maxDepth(root.left);
right = maxDepth(root.right);

...第一个调用返回left的值,然后第二个调用覆盖,因为第二个调用也执行left = maxDepth(root.left);。此外,如果您最终进一步递归(可能会如此),则left right都会被覆盖。