题目描述
思路解析动画文字版
记住「正常 BFS 按层收 → 最后整层倒序」,下面逐帧套它。注意每层是整层一起收下,再去找下一层。
什么是层:先找感觉:同一深度的节点属于同一层。根 3 是第 0 层,它的孩子 9、20 是第 1 层,再往下 15、7 是第 2 层。BFS 正是一层接一层地访问。
第 0 层就位:进入第 0 层,队列里是 [3]。这一层先整层收下,再去找它们的孩子组成下一层。
第 0 层 · 收值:从队首取出 3(标红),把它的值收进第 0 层的列表,现在本层是 [3]。
第 0 层 · 收孩子:3 处理完(变绿)。把它的非空孩子 9、20(蓝色)加入下一层,目前下一层攒到了 [9、20]。
第 0 层收齐:第 0 层整层收齐 = [3]。下一层 [9、20] 已就绪,继续往下。
第 1 层就位:进入第 1 层,队列里是 [9、20]。这一层先整层收下,再去找它们的孩子组成下一层。
第 1 层 · 收值:从队首取出 9(标红),把它的值收进第 1 层的列表,现在本层是 [9]。
第 1 层 · 收孩子:9 是叶子,没有孩子可加(变绿),下一层暂时还是 [空]。
第 1 层 · 收值:从队首取出 20(标红),把它的值收进第 1 层的列表,现在本层是 [9、20]。
第 1 层 · 收孩子:20 处理完(变绿)。把它的非空孩子 15、7(蓝色)加入下一层,目前下一层攒到了 [15、7]。
第 1 层收齐:第 1 层整层收齐 = [9、20]。下一层 [15、7] 已就绪,继续往下。
第 2 层就位:进入第 2 层,队列里是 [15、7]。这一层先整层收下,再去找它们的孩子组成下一层。
第 2 层 · 收值:从队首取出 15(标红),把它的值收进第 2 层的列表,现在本层是 [15]。
第 2 层 · 收孩子:15 是叶子,没有孩子可加(变绿),下一层暂时还是 [空]。
第 2 层 · 收值:从队首取出 7(标红),把它的值收进第 2 层的列表,现在本层是 [15、7]。
第 2 层 · 收孩子:7 是叶子,没有孩子可加(变绿),下一层暂时还是 [空]。
第 2 层收齐:第 2 层整层收齐 = [15、7]。没有下一层了,BFS 即将结束。
BFS 收集完成:队列空了,BFS 结束。自顶向下收集到 [[3], [9,20], [15,7]]。但题目要的是自底向上,所以最后把这些层整体倒过来。
倒序 · 第 1 层落位:倒序第 1 步:把原来的第 2 层 [15、7](高亮)放到结果里。现在自底向上结果是 [[15,7]]。
倒序 · 第 2 层落位:倒序第 2 步:把原来的第 1 层 [9、20](高亮)放到结果里。现在自底向上结果是 [[15,7], [9,20]]。
倒序 · 第 3 层落位:倒序第 3 步:把原来的第 0 层 [3](高亮)放到结果里。现在自底向上结果是 [[15,7], [9,20], [3]]。
完成:自底向上的层序遍历就是 [[15,7], [9,20], [3]]:最底层 [15、7] 排最前,根 [3] 在最后。回头看,就是一遍正常 BFS 按层收集,末尾整体倒序,时间 O(n)。
边界:空树返回空、单节点一层、链每层一个节点。
两个追问:头插可免末尾反转;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 levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]: if not root: return [] q, ans = [root], [] while q: ans.append([n.val for n in q]) q = [c for n in q for c in (n.left, n.right) if c] return ans[::-1]复杂度
- 时间:O(n),每个节点恰好出队、入队一次,n 是节点数;末尾整体倒序是 O(层数)
- 空间:O(n),队列最坏要装下最宽一层(可达 n/2 量级);结果数组本身也是 O(n)
易错点
面试追问把动画讲成自己的话
追问不想最后再反转,能直接得到自底向上吗?
追问层序遍历一般还能解决哪些问题?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
填充每个节点的下一个右侧节点指针 II
LeetCode 117 · 中等 · 沿着 树套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题