题目重点:hasNext看待处理队列,next一次返回一层,而非一个节点。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 只读有效有根N叉树,每节点value/children;独立iterator各自队列。
- next空时StopIteration;迭代期间树不修改,若允许修改要明确snapshot/live/fail-fast合同。
解题路线
- 初始化仅root。next开始记录本层queue长度,恰弹出这么多节点,收集values并把child入队。
- 循环若持续到queue空,会把所有后续层也吞进一次next,因此固定层宽是关键不变量。
- hasNext读取queue可O(1),next必须输出w个值,至少Ω(w)。children入队又有下一层边数成本;全部迭代每节点/边一次。
手动走一遍
根A,children B/C,B有D:next依次[A]、[B,C]、[D],随后hasNext False。空root初始就False,next明确抛StopIteration。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
from collections import deque
class LevelIterator:
def __init__(self,root):
self.queue=deque([root] if root is not None else [])
def hasNext(self):return bool(self.queue)
def next(self):
if not self.hasNext():raise StopIteration
level=[]
for _ in range(len(self.queue)):
u=self.queue.popleft();level.append(u.value)
self.queue.extend(u.children)
return level
复杂度
全部O(n)时间,单next O(w+nextLevelChildren),队列及返回O(maxWidth)。不能声称整层next最坏O(1)。
易错点与追问
容易失分的边界
- 返回队列本身会让后续变更污染以前结果,需独立level列表。
- hasNext调用不应弹出节点或改变下一层。
继续深挖
- 如果每next只返回一个节点,状态机如何改?
- 并发树更新时,快照复制和版本检测各有哪些代价?
