LeetCode 1302. 层数最深叶子节点的和
题目描述

题意分析
求最深一层所有节点值之和。最深层节点必然都是叶子,不需要另查叶子条件。
解法:层序遍历按层覆盖答案
核心思路
[!blue]
BFS 按层处理,每层开始清零本层和,固定当前层数量后累加。队列在本层处理期间加入的孩子属于下一层,不参与当前和。
每次覆盖前一层结果,遍历结束时留下的就是最深层之和。
解题步骤
- 根非空时入队。
- 每轮固定队列当前大小并将层和清零。
- 处理固定数量节点,加入非空孩子。
- 队列空后返回最后层和。
根一,下一层二、三,最深层四、五、六,各层和一、五、十五,最终返回十五。 根一的左孩子二是叶子,右孩子三下有叶子四时,最深层只包含四,结果四,不能再把浅层叶子二加上。
代码实现
class Solution {
public int deepestLeavesSum(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
int levelSum = 0;
while (!queue.isEmpty()) {
// 固定本层节点数,后续入队的孩子留到下一层。
int size = queue.size();
// 丢弃上一层的和,最终只保留最深层结果。
levelSum = 0;
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
levelSum += node.val;
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return levelSum;
}
}
func deepestLeavesSum(root *TreeNode) int {
if root == nil {
return 0
}
queue := []*TreeNode{root}
levelSum := 0
for len(queue) > 0 {
// 丢弃上一层的和,最终只保留最深层结果。
levelSum = 0
// 固定本层节点数,后续入队的孩子留到下一层。
size := len(queue)
for i := 0; i < size; i++ {
node := queue[0]
queue = queue[1:]
levelSum += node.Val
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
}
return levelSum
}
复杂度分析
- 时间复杂度:$O(n)$。
- 空间复杂度:$O(w)$,w 为最大层宽,最坏 $O(n)$。
关键点总结
[!green]
- 只保存最后一层的和,无需保存所有层结果。
- 链状树每层仅一个节点,队列也很小。
易错点总结
[!yellow]
- 层和只在循环外清零,会累加整棵树。
- 内层一直处理到队列空,会把后续层混进当前层。
- 把空孩子入队,会使后续取值失败。
相似题目
| 题目 | 难度 | 关联与区别 |
|---|---|---|
| 1161. 最大层内元素和 | 中等 | 同样逐层求和,原题选择和最大的一层,本题只保留最后一层的和。 |
转载与许可
许可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!