携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
题目描述
给定二叉树的根节点 root ,返回所有左叶子之和。
解题思路
这道题的最核心的点就是找到二叉树的所有左叶子节点,找到所有左叶子节点后求和就十分简单了。叶子节点就是没有左右子节点的节点,而左叶子节点就需要限制节点本身就是左节点。根据这些限制条件,可以推断出当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
左叶子节点需要满足:其父节点左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空。
也就是:
node.left && node.left.left === null && node.left.right === null
通过判断上面的条件,可以找到符合条件的节点进行处理。
接下来我们需要确定递归的逻辑:
- 首先需要确定递归的返回值,本题递归的返回值就是已经遍历到的左叶子节点的和
- 接下来确定递归的终止条件。可以很容易得出:如果节点为空返回0即可。
- 最后需要确定单层递归的逻辑,递归一次需要处理——当遇到左叶子节点的时候,记录下左叶子节点的数值。通过递归求左子树左叶子节点的值的和、右子树左叶子节点的值的和,相加求出整个二叉树左叶子节点的和。
经过上面的分析我们就能很容易的写出框架,将细节补充完整代码如下:
完整代码
var sumOfLeftLeaves = function(root) {
const nodeSum = function(node) {
if(node === null) {
return 0
}
let leftValue = nodeSum(node.left)
let rightValue = nodeSum(node.right)
let midValue = 0
if(node.left && node.left.left === null && node.left.right === null) {
midValue = node.left.val
}
let sum = midValue + leftValue + rightValue
return sum
}
return nodeSum(root)
};
后记
二叉树的递归法有很强的逻辑性,在做题的时候十分容易绕进去,所以要多做题多总结,加油!