一、题目内容 简单
给定二叉树的根节点 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 0
const 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 0
let sum = 0
const stack = [root]
while (stack.length) {
const node = stack.pop()
if (node.left && !node.left.left && !node.left.right) sum += node.left.val
if (node.right) stack.push(node.right)
if (node.left) stack.push(node.left)
}
return sum
};