题目描述
思路解析动画文字版
记住「队列按层展开,每层求和再除以个数」,下面逐帧套它。
什么是层:先找感觉:同一深度的节点属于同一层。根 48 是第 0 层,孩子 31、70 是第 1 层,再往下 24、36、60、20 是第 2 层。我们要在每一层里把所有值加起来、除以个数得平均。
第 0 层就位:进入第 0 层,队列里是 [48]。先把这一整层从左到右扫一遍,边扫边把值累进「本层和」、并数清「个数」。
第 0 层 · 累加:从队首取出 48(红),把它累加进本层和:0 + 48 = 48,个数变成 1。这是本层最后一个。
第 0 层 · 收孩子:48 加完了。把它的非空孩子 31、70(蓝色)加入下一层,目前下一层攒到了 [31、70]。
第 0 层平均 = 48:第 0 层整层扫完:和是 48、共 1 个,平均 48 ÷ 1 = 48,记进答案。现在各层平均是 [48]。下一层 [31、70] 已就绪,继续。
第 1 层就位:进入第 1 层,队列里是 [31、70]。先把这一整层从左到右扫一遍,边扫边把值累进「本层和」、并数清「个数」。
第 1 层 · 累加:从队首取出 31(红),把它累加进本层和:0 + 31 = 31,个数变成 1。本层还剩 [70] 没加。
第 1 层 · 收孩子:31 加完了。把它的非空孩子 24、36(蓝色)加入下一层,目前下一层攒到了 [24、36]。
第 1 层 · 累加:从队首取出 70(红),把它累加进本层和:31 + 70 = 101,个数变成 2。这是本层最后一个。
第 1 层 · 收孩子:70 加完了。把它的非空孩子 60、20(蓝色)加入下一层,目前下一层攒到了 [24、36、60、20]。
第 1 层平均 = 50.5:第 1 层整层扫完:和是 101、共 2 个,平均 101 ÷ 2 = 50.5,记进答案。现在各层平均是 [48、50.5]。下一层 [24、36、60、20] 已就绪,继续。
第 2 层就位:进入第 2 层,队列里是 [24、36、60、20]。先把这一整层从左到右扫一遍,边扫边把值累进「本层和」、并数清「个数」。
第 2 层 · 累加:从队首取出 24(红),把它累加进本层和:0 + 24 = 24,个数变成 1。本层还剩 [36、60、20] 没加。
第 2 层 · 收孩子:24 是叶子,没有孩子可加,下一层暂时还是 [空]。
第 2 层 · 累加:从队首取出 36(红),把它累加进本层和:24 + 36 = 60,个数变成 2。本层还剩 [60、20] 没加。
第 2 层 · 收孩子:36 是叶子,没有孩子可加,下一层暂时还是 [空]。
第 2 层 · 累加:从队首取出 60(红),把它累加进本层和:60 + 60 = 120,个数变成 3。本层还剩 [20] 没加。
第 2 层 · 收孩子:60 是叶子,没有孩子可加,下一层暂时还是 [空]。
第 2 层 · 累加:从队首取出 20(红),把它累加进本层和:120 + 20 = 140,个数变成 4。这是本层最后一个。
第 2 层 · 收孩子:20 是叶子,没有孩子可加,下一层暂时还是 [空]。
第 2 层平均 = 35:第 2 层整层扫完:和是 140、共 4 个,平均 140 ÷ 4 = 35,记进答案。现在各层平均是 [48、50.5、35]。没有下一层了,BFS 结束。
完成:每一层的平均值依次是 [48、50.5、35]。回头看,就是一遍标准的按层 BFS,每层从左到右把值加起来、再除以个数,一次遍历就出全部答案,时间 O(n)。
边界:空树返回空、单节点即自身、负数照常累加求平均。
两个追问:DFS 带 depth 也能做;按层 BFS 框架解一大类题。
参考代码
from typing import List, Optionalclass TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = rightclass Solution: def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]: if not root: return [] q, ans = [root], [] while q: ans.append(sum(n.val for n in q) / len(q)) q = [c for n in q for c in (n.left, n.right) if c] return ans复杂度
- 时间:O(n),每个节点恰好出队、入队一次,累加时也只看一次,n 是节点数
- 空间:O(w),w 是树的最大宽度,队列最坏要同时装下最宽一层(可达 n/2 量级)
易错点
面试追问把动画讲成自己的话
追问用 DFS 能做吗?
追问这类「按层」的题还有哪些变体?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
叶子相似的树
LeetCode 872 · 简单 · 沿着 树套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题