携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
层数最深的叶子节点和
描述
给你一颗二叉树根节点root,你需要返回二叉树最深的所有叶子节点和。
如上图二叉树,叶子节点有7,5,8三个节点,但其中节点5只有三层,而节点7和8都是四层,那最深就是叶子节点7和8,两者值相加等于15,所以返回结果是15。
分析
叶子节点判断很简单,就是左右子节点都等于null,但现在最主要的是需要知道最深的所有叶子节点,然后再求和返回。
或者我们知道二叉树的最大层级,再把最大层级的节点值求和也是正确的结果。
那如何实现呢?
大体有两种思路,之前也都说过,广度优先搜索(BFS)和深度优先搜索(DFS)。
广度优先搜索是将每层节点进行循环,如果不是最后一层级的话,则不需要累加节点值,只需要对最后一层级,也就是最深的叶子节点了,进行求和运算返回,难点在于怎么设计仅对每一层级单独组合。
深度优先搜索不断循环每一条向下路径,直到最后一层再走第一条路径,因为这样不能横向对比,不知道当前最深层级是否是整个二叉树的最大层级,这样我们需要保存当前层级作为最大层级,并且当前分支的最大层级值作为总和的初始值,以后的每次路径循环都与之前最大层级进行比较,若等于,则继续累加,若小于不用处理,大于则说明目前最大层级在当前路径中。
程序实现
根据以上深度优先搜索的分析,代码实现如下:
var deepestLeavesSum = function(root) {
let maxLevel = -1
let sum = 0
const dfs = (node, level) => {
if (!node) return
if (level > maxLevel) {
// 可能是首次达到最大层级,给层级和总和都赋初始值
maxLevel = level
sum = node.val
} else if (level === maxLevel) {
// 最大层级累加求和
sum += node.val
}
dfs(node.left, level + 1)
dfs(node.right, level + 1)
}
dfs(root, 0)
return sum
};