LeetCode 199中等二叉树 · BFS
二叉树右视图 图解题解
从右边看一棵树,你究竟能看到哪些节点?
站在楼梯右侧往左看,每一级台阶只看到最靠近你的那个人,后面的被挡住了。BFS 把树一层层展开,每层末尾那个节点就是「站在右边最先看到的」;同层靠左的节点被更右的兄弟遮住,根本入不了右视图。
这道题到底在问什么
从右侧看二叉树,返回每一层最右边的节点值。
- root
- [1,2,3,null,5,null,4]
- 输出
- [1,3,4]
最优解:一步一步想明白
- 3关键不是背模板,而是看懂为什么这题适合二叉树 · BFS。
- 4右视图=站在树右边,每一层最先看到的那个=每层最右节点。用 BFS 一层一层处理,根 1 先入队。
- 5第 0 层只有 [1],最右(也是唯一)是 1 → 答案 [1]。把它的孩子 2、3 入队,组成下一层。
- 6第 1 层从左到右是 [2, 3],最右是 3 → 答案 [1,3]。把 5、4 入队。(2 在本层但不是最右,看不到)
- 7第 2 层从左到右是 [5, 4](5 是 2 的左孩子,4 是 3 的右孩子),最右是 4 → 答案 [1,3,4]。
- 8把每层最右连起来——从右边看过去最先看到的就是 [1,3,4]。注意 5 虽在第 2 层,却被同层更右的 4 挡住,看不到。右视图取的是「每层最右」,不是「所有右孩子」。
- 11把这句话记住,下次遇到同类题,就能更快选出方向。
⚠️ 容易写错的地方
✗ 错:不固定每层 size
✓ 对:先锁层,再找本层最后一个
否则下一层节点会混进来
✗ 错:在 for 循环里直接读 len(q)
✓ 对:循环前先存 size = len(q)
循环中把下一层节点加进了队尾,len(q) 会一直变大,分层就乱套了。
✗ 错:变量名和动画不一致
✓ 对:代码变量沿用动画里的核心名字
学习时最怕脑内维护两套概念
完整代码(Python / C++ / Java)
Python
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 ansC++
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> ans;
if (!root) return ans;
queue<TreeNode*> q; q.push(root);
while (!q.empty()) {
int size = q.size(); // 锁定本层节点数
for (int i = 0; i < size; i++) {
TreeNode* node = q.front(); q.pop();
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
if (i == size - 1) ans.push_back(node->val); // 本层最右
}
}
return ans;
}
};Java
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null) return ans;
Queue<TreeNode> q = new LinkedList<>(); q.offer(root);
while (!q.isEmpty()) {
int size = q.size(); // 锁定本层节点数
for (int i = 0; i < size; i++) {
TreeNode node = q.poll();
if (node.left != null) q.offer(node.left);
if (node.right != null) q.offer(node.right);
if (i == size - 1) ans.add(node.val); // 本层最右
}
}
return ans;
}
}套路模板 · 二叉树 · BFS
# 二叉树按层 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)复杂度
时间复杂度
O(n)
每个节点进队、出队各一次,O(n)
空间复杂度
O(w)
队列最多存一整层节点 = 树的最大宽度 w
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 二叉树右视图 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
BFS 和 DFS 哪种更直观?+
BFS 每层取最后一个最直观;DFS 用「根→右→左」按深度首次到达记录,也 O(n)。
为什么不是「所有右孩子」?+
某节点没有右孩子但有左孩子时,左孩子可能是该层最右,所以看的是「每层最右」。
复杂度?+
O(n),BFS 队列 O(宽度)、DFS 栈 O(高度)。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。