标准答案
- 根节点为空时返回空结果。
- 每轮固定处理当前 queue.length 个节点,收集值后再把下一层节点入队。
- 每个节点入队和出队一次,时间 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,空树返回空结果。