标准答案

  1. 根节点为空时返回空结果。
  2. 每轮固定处理当前 queue.length 个节点,收集值后再把下一层节点入队。
  3. 每个节点入队和出队一次,时间 O(n),队列空间最坏 O(n)。

题目解析

层序遍历使用队列维护广度优先顺序。每轮开始先保存当前 queue.length,这个数字就是本层节点数量;本轮新入队的左右子节点要留到下一轮处理。

空树直接返回空数组。使用数组实现队列时,频繁 shift 可能导致额外搬移成本,生产实现应使用 head 下标或双端队列。

每个节点只入队和出队一次,时间复杂度 O(n),空间复杂度取决于最大层宽度,最坏为 O(n)。聚合、按层计数和层间隔都可以复用同一边界。

代码示例

按层聚合:

TypeScript
const result: number[][] = []
if (root) queue.push(root)
while (queue.length) {
  const level: number[] = []
  const size = queue.length
  for (let i = 0; i < size; i++) {
    const node = queue.shift()!
    level.push(node.value)
    if (node.left) queue.push(node.left)
    if (node.right) queue.push(node.right)
  }
  result.push(level)
}

常见误区

  • 误区:在超大树上频繁使用数组 shift 却忽略搬移成本。改正:使用 head 下标或专用队列。
  • 误区:循环中使用动态 queue.length 作为本层边界。改正:每轮先保存 size,动态增长的队列只属于下一层。
  • 误区:空树仍访问 root.value。改正:入队前判断 root,空树返回空结果。

作者信息