给定二叉树的根节点 root ,返回所有左叶子之和。

    示例 1:
    输入: root = [3,9,20,null,null,15,7]

    1. 3
    2. / \
    3. 9 20
    4. / \
    5. 15 7

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

    示例 2:
    输入: root = [1]
    输出: 0

    算法需要有个返回结果,递归算法框架(借助辅助函数):

    1. public int sumOfLeftLeaves(TreeNode root) {
    2. return sumOfLeftLeaves(root, 0);
    3. }
    4. public int sumOfLeftLeaves(TreeNode root, int sum) {
    5. }

    当遍历到某个节点时,此节点需要做什么?
    1.若节点为空,结束遍历
    2.若节点不为空
    2.1)若节点的左子节点和右子节点都为空,节点是根节点,则结束遍历
    2.2)若节点的左子节点不为空
    2.2.1)若左子节点是叶子节点,则该左子节点是左叶子节点,累加左子节点的值到结果中
    2.2.2)若左子节点不是叶子节点,则继续遍历左子节点
    2.3)若节点的右子节点不为空
    2.3.1)若右子节点是叶子节点,则结束遍历
    2.3.2)若右子节点不是叶子节点,则继续遍历右子节点

    1. public int sumOfLeftLeaves(TreeNode root, int sum) {
    2. if (root == null) {
    3. return sum;
    4. }
    5. if (root.left == null && root.right == null) {
    6. return sum;
    7. }
    8. if (root.left != null) {
    9. if (root.left.left == null && root.left.right == null) {
    10. // 左子节点是叶子节点
    11. sum = sum + root.left.val;
    12. } else {
    13. // 左子节点不是叶子节点,继续遍历左子节点
    14. sum = sumOfLeftLeaves(root.left, sum);
    15. }
    16. }
    17. if (root.right != null) {
    18. if (root.right.left == null && root.right.right == null) {
    19. // 右子节点是叶子节点,结束遍历
    20. return sum;
    21. } else {
    22. // 右子节点不是叶子节点,继续遍历右子节点
    23. sum = sumOfLeftLeaves(root.right, sum);
    24. }
    25. }
    26. return sum;
    27. }