一、题目内容 简单

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

示例1:

输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 9. 左叶子之和 - 图1

示例2:

输入: root = [1] 输出: 0

提示:

  • 节点数在 [1, 1000] 范围内
  • -1000 <= Node.val <= 1000

二、解题思路

首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。
因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:如果左节点不为空,且左节点没有左右孩子,那么这个节点的左节点就是左叶子。
那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。

如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下:

  1. if (node.left && !node.left.left && !node.left.right) {}

三、具体代码

  1. /**
  2. * @param {TreeNode} root
  3. * @return {number}
  4. */
  5. var sumOfLeftLeaves = function (root) {
  6. if (!root) return 0
  7. const leftSum = sumOfLeftLeaves(root.left)
  8. const rightSum = sumOfLeftLeaves(root.right)
  9. if (root.left && !root.left.left && !root.left.right) {
  10. return root.left.val + leftSum + rightSum
  11. }
  12. return leftSum + rightSum
  13. };

四、其他解法

迭代法

  1. /**
  2. * @param {TreeNode} root
  3. * @return {number}
  4. */
  5. var sumOfLeftLeaves = function (root) {
  6. if (!root) return 0
  7. let sum = 0
  8. const stack = [root]
  9. while (stack.length) {
  10. const node = stack.pop()
  11. if (node.left && !node.left.left && !node.left.right) sum += node.left.val
  12. if (node.right) stack.push(node.right)
  13. if (node.left) stack.push(node.left)
  14. }
  15. return sum
  16. };