救救孩子吧,递归硬是,没搞懂

leetCode 404 左叶子之和
计算给定二叉树的所有左叶子之和。

示例:

3
/ \
9  20
/  \
15   7

在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //这里为何使用局部变量,全局变量就不行
        int sum = 0;
        if (isLeftLeave(root.left)) {
            sum += root.left.val;
        } else {
            sum += sumOfLeftLeaves(root.left);
        }
        sum += sumOfLeftLeaves(root.right);
        return sum;
    }

    private boolean isLeftLeave(TreeNode treeNode) {
        return treeNode != null && (treeNode.left == null && treeNode.right == null);
    }
}
而像leetCode 563,求坡度就用全局变量,个人认为全局变量能理解。但这里为何递归sum要归零啊

#leetcode#
全部评论
局部变量使得每一个子程序会有一个单独的变量 但是如果使用全局变量 你的sum只会越来越大。
点赞 回复 分享
发布于 2019-11-03 21:36
你用了全局变量之后,递归的函数内部把sum加了一次,递归函数返回的数字把sum又加了一次,这就不对了吧。 你就想这种情况      1   / 2 你应该就加了两个2
点赞 回复 分享
发布于 2019-11-03 21:37
全局变量也可以 但是全局变量就不需要返回了,直接加, 对于为什么要int sum =0,是因为假设递归到叶子那一层,此时sum当然为0啊,然后加到上一层的sum接着一直往上....联想一下这个过程就OK
点赞 回复 分享
发布于 2019-11-03 21:40
sum不是归零,而是子过程中新的sum
点赞 回复 分享
发布于 2019-11-03 22:00
leetCode 563:二叉树的坡度 给定一个二叉树,计算整个树的坡度。 一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。 整个树的坡度就是其所有节点的坡度之和。 示例: 输入:          1        /   \       2     3 输出: 1 解释: 结点的坡度 2 : 0 结点的坡度 3 : 0 结点的坡度 1 : |2-3| = 1 树的坡度 : 0 + 0 + 1 = 1 public class Solution {     //此时是成员变量     int tilt=0;     public int findTilt(TreeNode root) {         traverse(root);         return tilt;     }     public int traverse(TreeNode root)     {         if(root==null )             return 0;         int left=traverse(root.left);         int right=traverse(root.right);         tilt+=Math.abs(left-right);         return left+right+root.val;     } } 这又怎么看
点赞 回复 分享
发布于 2019-11-03 22:07
每个递归过程都有一个sum,你也可以用全局变量,只不过没有返回值了
点赞 回复 分享
发布于 2019-11-03 22:08
不用全局变量这么改,通过了
点赞 回复 分享
发布于 2019-11-03 22:25

相关推荐

牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-26 20:06
点赞 评论 收藏
分享
点赞 5 评论
分享
牛客网
牛客企业服务