题目描述
思路解析动画文字版
记住「答案桶下标 = 高度 h = max(左,右)+1,叶子 h=0;屏幕第几轮 = h+1」,下面按轮把叶子逐个剥下来。
准备 · 完整的树:这是完整的二叉树,共 11 个节点。下面一轮一轮地把当前叶子剥下来;一个节点高度为 h,就落在答案桶 ans[h],对应屏幕上的第 h+1 轮。
第 1 轮 · 找当前叶子:第 1 轮。树最外层、没有孩子的节点(原始叶子)是 20、60、35、75、70、90(紫色)。它们高度都是 0,落在答案桶 ans[0],对应屏幕第 1 轮。
第 1 轮 · 收入 20:把叶子 20 收进第 1 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 1 轮 · 收入 60:把叶子 60 收进第 1 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 1 轮 · 收入 35:把叶子 35 收进第 1 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 1 轮 · 收入 75:把叶子 75 收进第 1 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 1 轮 · 收入 70:把叶子 70 收进第 1 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 1 轮 · 收入 90:把叶子 90 收进第 1 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 1 轮 · 剥除:第 1 轮的叶子 [20,60,35,75,70,90] 全部剥下(转蓝表示已删除)。剩下的节点里,又冒出了新的叶子,进入下一轮。
第 2 轮 · 找当前叶子:第 2 轮。前一轮的叶子已剥掉(蓝色),又冒出新的叶子 10、40、80(紫色)。它们高度是 1,落在桶 ans[1],对应屏幕第 2 轮。
第 2 轮 · 收入 10:把叶子 10 收进第 2 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 2 轮 · 收入 40:把叶子 40 收进第 2 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 2 轮 · 收入 80:把叶子 80 收进第 2 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 2 轮 · 剥除:第 2 轮的叶子 [10,40,80] 全部剥下(转蓝表示已删除)。剩下的节点里,又冒出了新的叶子,进入下一轮。
第 3 轮 · 找当前叶子:第 3 轮。前一轮的叶子已剥掉(蓝色),又冒出新的叶子 30(紫色)。它们高度是 2,落在桶 ans[2],对应屏幕第 3 轮。
第 3 轮 · 收入 30:把叶子 30 收进第 3 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 3 轮 · 剥除:第 3 轮的叶子 [30] 全部剥下(转蓝表示已删除)。剩下的节点里,又冒出了新的叶子,进入下一轮。
第 4 轮 · 找当前叶子:第 4 轮。前一轮的叶子已剥掉(蓝色),又冒出新的叶子 50(紫色)。它们高度是 3,落在桶 ans[3],对应屏幕第 4 轮。
第 4 轮 · 收入 50:把叶子 50 收进第 4 轮(变绿)。它没有还留在树上的孩子,正是当前的叶子。
第 4 轮 · 剥除:第 4 轮的叶子 [50] 全部剥下(转蓝表示已删除)。树已空,结束。
完成:全部剥完,答案就是每轮收集的列表:[[20,60,35,75,70,90], [10,40,80], [30], [50]]。每个节点恰好落在「桶下标 = 它的高度 h」,对应屏幕第 h+1 轮。
边界先想清:单节点、空树、链状。
面试高频:讲清高度 vs 深度,以及组内顺序来源。
参考代码
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 findLeaves(self, root: Optional[TreeNode]) -> List[List[int]]: ans = [] def height(node): if not node: return -1 h = max(height(node.left), height(node.right)) + 1 if h == len(ans): ans.append([]) ans[h].append(node.val) return h height(root) return ans复杂度
- 时间:O(n),每个节点只被 DFS 访问一次
- 空间:O(n),答案存所有节点 + 递归栈深 O(h)
易错点
面试追问把动画讲成自己的话
追问高度和深度到底差在哪?
追问每轮内部节点的顺序由什么决定?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
建立四叉树
LeetCode 427 · 中等 · 沿着 树套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题