一、题目内容 简单
给定二叉树的根节点 root ,返回所有左叶子之和。
示例1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例2:
输入: root = [1] 输出: 0
提示:
- 节点数在 [1, 1000] 范围内
 - -1000 <= Node.val <= 1000
 
二、解题思路
首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。
因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:如果左节点不为空,且左节点没有左右孩子,那么这个节点的左节点就是左叶子。
那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下:
if (node.left && !node.left.left && !node.left.right) {}
三、具体代码
/*** @param {TreeNode} root* @return {number}*/var sumOfLeftLeaves = function (root) {if (!root) return 0const leftSum = sumOfLeftLeaves(root.left)const rightSum = sumOfLeftLeaves(root.right)if (root.left && !root.left.left && !root.left.right) {return root.left.val + leftSum + rightSum}return leftSum + rightSum};
四、其他解法
迭代法
/*** @param {TreeNode} root* @return {number}*/var sumOfLeftLeaves = function (root) {if (!root) return 0let sum = 0const stack = [root]while (stack.length) {const node = stack.pop()if (node.left && !node.left.left && !node.left.right) sum += node.left.valif (node.right) stack.push(node.right)if (node.left) stack.push(node.left)}return sum};

