§1
题目描述
从右侧看二叉树,返回每一层最右边的节点值。
root = [1,2,3,null,5,null,4]
输出 = [1,3,4]
§2
思路解析动画文字版
关键不是背模板,而是看懂为什么这题适合二叉树 · BFS。
1. 右视图 = 每层最右:右视图=站在树右边,每一层最先看到的那个=每层最右节点。用 BFS 一层一层处理,根 1 先入队。
2. 第 0 层:最右是 1:第 0 层只有 [1],最右(也是唯一)是 1 → 答案 [1]。把它的孩子 2、3 入队,组成下一层。
3. 第 1 层:最右是 3:第 1 层从左到右是 [2, 3],最右是 3 → 答案 [1,3]。把 5、4 入队。(2 在本层但不是最右,看不到)
4. 第 2 层:最右是 4:第 2 层从左到右是 [5, 4](5 是 2 的左孩子,4 是 3 的右孩子),最右是 4 → 答案 [1,3,4]。
5. 关键帧 · 右边看过去:把每层最右连起来——从右边看过去最先看到的就是 [1,3,4]。注意 5 虽在第 2 层,却被同层更右的 4 挡住,看不到。右视图取的是「每层最右」,不是「所有右孩子」。
把这句话记住,下次遇到同类题,就能更快选出方向。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
§3
参考代码
class Solution: def rightSideView(self, root): if not root: return [] from collections import deque q = deque([root]) ans = [] while q: size = len(q) # 锁定本层节点数 for i in range(size): node = q.popleft() if node.left: q.append(node.left) if node.right: q.append(node.right) if i == size - 1: # 本层最右 ans.append(node.val) return ans看懂代码不等于写得出。盖住上面,自己默写一遍试试。卡在哪一行说不清,就点右下角问小欧。
§4
复杂度
- 时间复杂度:O(n),每个节点进队、出队各一次,O(n)
- 空间复杂度:O(w),队列最多存一整层节点 = 树的最大宽度 w
§5
可套用的代码模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
Python
# 二叉树按层 BFS 骨架(右视图/层均值/锯齿都用它)q = deque([root]) if root else deque()while q: size = len(q) # 关键:先锁定本层个数 for i in range(size): node = q.popleft() if i == size - 1: 记录本层最右 # 右视图取这个 if node.left: q.append(node.left) if node.right: q.append(node.right)§6
易错点
✗ 错误写法:不固定每层 size
✓ 正确写法:先锁层,再找本层最后一个
否则下一层节点会混进来
✗ 错误写法:在 for 循环里直接读 len(q)
✓ 正确写法:循环前先存 size = len(q)
循环中把下一层节点加进了队尾,len(q) 会一直变大,分层就乱套了。
✗ 错误写法:变量名和动画不一致
✓ 正确写法:代码变量沿用动画里的核心名字
学习时最怕脑内维护两套概念
§
面试追问把动画讲成自己的话
追问BFS 和 DFS 哪种更直观?
BFS 每层取最后一个最直观;DFS 用「根→右→左」按深度首次到达记录,也 O(n)。
追问为什么不是「所有右孩子」?
某节点没有右孩子但有左孩子时,左孩子可能是该层最右,所以看的是「每层最右」。
追问复杂度?
O(n),BFS 队列 O(宽度)、DFS 栈 O(高度)。
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
下一题 · 树 10/23
→统计二叉树中好节点的数目
LeetCode 1448 · 中等 · 沿着 树 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
299道动画图解
37节语音讲解
28课数据结构
¥0.27折合 / 天
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
¥99 开通年卡 →
想成体系刷透这类套路?去图解算法专题