题目重点:Applied Scientist/MLE 技术轮都提打印树到叶路径;按叶节点定义递归/迭代遍历并计算路径拷贝成本。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版是一棵有限、无环、非空二叉树,叶为 left/right 均空;若是多叉树,遍历 children 即可。
- 输出每条根到叶的节点值列表,按先左后右 DFS 顺序;若要求格式化字符串,只改输出层。
- 空树返回空列表,节点值可重复,不按值去重。
解题路线
- DFS 进入节点时把值加入 path;若左右均空,复制当前 path 到答案;否则先左后右递归,然后退出时 pop。
- 复制路径只发生在叶,避免每经过一条边就创建新列表;若要避免递归深度溢出,用显式栈保存 (node,path/parentPointer)。
- 正确性由 DFS 每个叶访问恰一次,当前 path 恰为根到该叶的祖先序列。
- 检查单节点树、只有左链、平衡树、重复值、空树和极深树。
手动走一遍
训练树根 1,左子 2,右子 3;2 的右子 4。按先左后右输出 [[1,2,4],[1,3]]。节点 2 不是叶,不能提前输出 [1,2]。
规模与取舍
n 个节点遍历 O(n),另加实际输出总长度 S=Σ叶路径长度,整体 O(n+S) 时间;递归栈 O(h),答案 O(S),h 为树高。极端星形/深链的 S 与 n 关系不同,不能笼统说纯 O(n) 输出。
易错点与追问
容易失分的边界
- 到任意节点都输出一条路径,而非只到叶。
- 把可变 path 引用直接 append 到答案,回溯后所有结果变空/相同。
- 只按节点值去重,重复值的不同叶路径丢失。
- 忘记极深树递归栈风险。
继续深挖
- 多叉树怎样改?
- 只统计路径数或路径和时如何省空间?
- 路径输出很大时如何流式生成?
- 树可能共享子节点/有环时要不要去重?
