携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情 >>
题目
给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的和 。
示例 1:
输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出:15
示例 2:
输入:root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]
输出:19
提示:
- 树中节点数目在范围
[1, 10^4]之间。 1 <= Node.val <= 100
思考
本题难度中等。
首先是读懂题意。题目很简单,也就是给出一棵二叉树的根节点 root ,我们需要返回层数最深的叶子节点的和。
我们可以使用深度优先搜索的方法来解决问题。定义最深的一层节点的和为 sum,最深一层的层数为 maxLevel(初始值设置为 -1),根节点的层数为0。遍历二叉树,判断节点是否为同一层,若是则将节点的值加到 sum 上,如果是下一层,则更新 sum 为 0,继续累加新一层的节点的值。最后,返回 sum 的值即可。
此外,我们不难想到 Leetcode 102.二叉树的层序遍历 的题目,与本题很类似。Leetcode 102 是遍历二叉树的每一层,并把相同层的节点存入同一个数组中。那么。我们可以借用该方法,先是得出由二叉树的不同层组成的数组,返回数组最后的一个元素(即二叉树最深的一层的所有节点),再对该节点数组遍历求和即可,也就是广度优先搜索的方法。
解答
方法一:深度优先搜索
/**
* @param {TreeNode} root
* @return {number}
*/
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
}
复杂度分析:
- 时间复杂度:O(n),其中 n 是二叉树的节点数。深度优先搜索需要遍历每个节点一次。
- 空间复杂度:O(n)。
方法二:广度优先搜索
/**
* @param {TreeNode} root
* @return {number}
*/
var deepestLeavesSum = function(root) {
let levelArr = levelOrder(root)
let deepestLevel = levelArr[levelArr.length - 1]
return deepestLevel.reduce((sum, item) => sum + item, 0)
}
// 二叉树的层序遍历
var levelOrder = function(root) {
const res = []
if(!root) {
return res
}
const q = [] // 队列
q.push(root)
while(q.length > 0) {
let size = q.length
res.push([])
while(size > 0) {
const node = q.shift()
res[res.length - 1].push(node.val) // 存储每层的所有节点
if (node.left) q.push(node.left)
if (node.right) q.push(node.right)
size--
}
}
return res
}
复杂度分析:
- 时间复杂度:O(n),其中 n 是二叉树的节点数。
- 空间复杂度:O(n)。