题目描述
思路解析动画文字版
记住「队列按层展开,每层扫一遍取最大」,下面逐帧套它。
什么是层:先找感觉:同一深度的节点属于同一层。根 50 是第 0 层,孩子 30、80 是第 1 层,再往下 60、20、75、40 是第 2 层。我们要在每一层里挑出最大值。
第 0 层就位:进入第 0 层,队列里是 [50]。先把这一整层从左到右扫一遍,边扫边更新「本层最大」。
第 0 层 · 比较:从队首取出 50(红),它是本层第一个节点,先把本层最大记成 50(金色标出)。
第 0 层 · 收孩子:50 看完了。把它的非空孩子 30、80(蓝色)加入下一层,目前下一层攒到了 [30、80]。
第 0 层最大 = 50:第 0 层整层扫完,最大值是 50(金色标出),记进答案。现在各层最大是 [50]。下一层 [30、80] 已就绪,继续。
第 1 层就位:进入第 1 层,队列里是 [30、80]。先把这一整层从左到右扫一遍,边扫边更新「本层最大」。
第 1 层 · 比较:从队首取出 30(红),它是本层第一个节点,先把本层最大记成 30(金色标出)。
第 1 层 · 收孩子:30 看完了。把它的非空孩子 60、20(蓝色)加入下一层,目前下一层攒到了 [60、20]。
第 1 层 · 比较:看节点 80(红):它比当前最大 30 还大,本层最大更新成 80,金色标记移到它身上。
第 1 层 · 收孩子:80 看完了。把它的非空孩子 75、40(蓝色)加入下一层,目前下一层攒到了 [60、20、75、40]。
第 1 层最大 = 80:第 1 层整层扫完,最大值是 80(金色标出),记进答案。现在各层最大是 [50、80]。下一层 [60、20、75、40] 已就绪,继续。
第 2 层就位:进入第 2 层,队列里是 [60、20、75、40]。先把这一整层从左到右扫一遍,边扫边更新「本层最大」。
第 2 层 · 比较:从队首取出 60(红),它是本层第一个节点,先把本层最大记成 60(金色标出)。
第 2 层 · 收孩子:60 是叶子,没有孩子可加,下一层暂时还是 [空]。
第 2 层 · 比较:看节点 20(红):它没有超过当前最大 60,本层最大保持 60 不变。
第 2 层 · 收孩子:20 是叶子,没有孩子可加,下一层暂时还是 [空]。
第 2 层 · 比较:看节点 75(红):它比当前最大 60 还大,本层最大更新成 75,金色标记移到它身上。
第 2 层 · 收孩子:75 是叶子,没有孩子可加,下一层暂时还是 [空]。
第 2 层 · 比较:看节点 40(红):它没有超过当前最大 75,本层最大保持 75 不变。
第 2 层 · 收孩子:40 是叶子,没有孩子可加,下一层暂时还是 [空]。
第 2 层最大 = 75:第 2 层整层扫完,最大值是 75(金色标出),记进答案。现在各层最大是 [50、80、75]。没有下一层了,BFS 即将结束。
完成:每一层的最大值依次是 [50、80、75]。回头看,就是一遍标准的按层 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 largestValues(self, root: Optional[TreeNode]) -> List[int]: if not root: return [] q, ans = [root], [] while q: ans.append(max(n.val for n in 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 623 · 中等 · 沿着 树套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题