SWE · Coding

按整层返回的树Iterator:队列快照和输出成本

hasNext看待处理队列,next一次返回一层,而非一个节点。

题目重点:hasNext看待处理队列,next一次返回一层,而非一个节点。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 只读有效有根N叉树,每节点value/children;独立iterator各自队列。
  • next空时StopIteration;迭代期间树不修改,若允许修改要明确snapshot/live/fail-fast合同。

解题路线

  1. 初始化仅root。next开始记录本层queue长度,恰弹出这么多节点,收集values并把child入队。
  2. 循环若持续到queue空,会把所有后续层也吞进一次next,因此固定层宽是关键不变量。
  3. 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只返回一个节点,状态机如何改?
  • 并发树更新时,快照复制和版本检测各有哪些代价?
✓已复制微信号!