155 字 少于 1 分钟阅读

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

示例:

    3
   / \
  9  20
    /  \
   15   7

在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

思路

二叉树问题基本上都可以递归解决。当前节点的所有左叶子之和等于左右子树的左叶子之和。

注意叶子节点不是孩子节点。

解法

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return sumVal(root, false);
    }

    public int sumVal(TreeNode root, boolean leftFlag) {
        if (root == null) {
            return 0;
        }
        int sum = 0;
        if (leftFlag && root.left == null && root.right == null) {
            sum += root.val;
            return sum;
        }
        int leftSum = sumVal(root.left, true);
        int rightSum = sumVal(root.right, false);
        return leftSum + rightSum;
    }
}

优化

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) return 0;
        int leftValue = sumOfLeftLeaves(root.left);    // 左
        int rightValue = sumOfLeftLeaves(root.right);  // 右
        //获取左叶子节点值
        int midValue = 0;
        if (root.left != null && root.left.left == null && root.left.right == null) { // 中
            midValue = root.left.val;
        }
        int sum = midValue + leftValue + rightValue;
        return sum;
    }
}