题目描述
思路解析动画文字版
记住这条:BFS 每层从左往右出队,最后出队的那个就在最右边,收下它。
根节点入队,开始逐层 BFS。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
出队 1:它是第 1 层最后一个出队的——也就是这一层最右节点。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
站右边看,第 1 层只看得到 1,记入右视图。右视图现在:[1]——继续下一层,依旧只取最右。
1 的孩子 2 入队,排到下一层。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
1 的孩子 3 入队,排到下一层。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
出队 2:第 2 层的节点,但它右边还有同层节点,看不到。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
2 的孩子 4 入队,排到下一层。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
2 的孩子 5 入队,排到下一层。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
出队 3:它是第 2 层最后一个出队的——也就是这一层最右节点。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
站右边看,第 2 层只看得到 3,记入右视图。右视图现在:[1, 3]——继续下一层,依旧只取最右。
3 的孩子 6 入队,排到下一层。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
3 的孩子 7 入队,排到下一层。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
出队 4:第 3 层的节点,但它右边还有同层节点,看不到。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
4 的孩子 8 入队,排到下一层。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
出队 5:第 3 层的节点,但它右边还有同层节点,看不到。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
5 的孩子 11 入队,排到下一层。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
出队 6:第 3 层的节点,但它右边还有同层节点,看不到。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
6 的孩子 13 入队,排到下一层。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
出队 7:它是第 3 层最后一个出队的——也就是这一层最右节点。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
站右边看,第 3 层只看得到 7,记入右视图。右视图现在:[1, 3, 7]——继续下一层,依旧只取最右。
出队 8:第 4 层的节点,但它右边还有同层节点,看不到。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
出队 11:第 4 层的节点,但它右边还有同层节点,看不到。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
出队 13:它是第 4 层最后一个出队的——也就是这一层最右节点。每层最后一个出队的就是最右;BFS 是从左到右出队,所以最后那个一定在最右边。
站右边看,第 4 层只看得到 13,记入右视图。右视图现在:[1, 3, 7, 13]——继续下一层,依旧只取最右。
空树、单节点、只有左链都要照顾到——只有左链时每层唯一节点就是「最右」,逻辑不变。
BFS 取每层最右,或 DFS 按根右左每层首达——两条路都对,本质都是「每层只留最右」。
参考代码
def rightSideView(root): if not root: return [] res, q = [], deque([root]) while q: sz = len(q) # 锁定本层个数 for i in range(sz): node = q.popleft() # 从左到右出队 if i == sz - 1: # 本层最后一个 = 最右 res.append(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) return res复杂度
- 时间:O(n),每个节点恰好入队、出队各一次
- 空间:O(n),队列最多装下最宽一层的节点
易错点
面试追问把动画讲成自己的话
追问能不能用 DFS 做右视图?
追问右视图为什么不是一路走右孩子?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
统计二叉树中好节点的数目
LeetCode 1448 · 中等 · 沿着 树 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题