层序遍历必须用队列而非栈,因其需FIFO保证“从上到下、从左到右”逐层访问;栈的LIFO会导致深度优先式乱序,且易引发死循环或层数错位。
为什么层序遍历必须用队列,不能用栈
因为层序遍历要求“从上到下、从左到右”逐层访问节点,本质是先进先出(FIFO)——新一层的子节点必须等当前层所有节点处理完才能开始访问。栈是后进先出(LIFO),会把刚压入的右子节点优先弹出,导致顺序变成“根→右→左→右子树的右……”,实际跑出来是深度优先的变种,不是层序。
常见错误现象:std::stack 实现时输出顺序乱、层数错位、甚至死循环(尤其有重复指针或空指针未判时)。
- 队列保证同一层节点在队首连续排列,
front()取出后pop(),再把它的左右子节点push()到队尾 - 每轮循环前记录
q.size(),用于控制本轮只处理“当前层”的节点数,避免新入队的下层节点干扰计数 - 空指针必须跳过:遇到
nullptr不能调用left/right,也不能入队
标准实现中如何正确分层输出
如果题目要求返回二维 vector(每层一个子 vector),关键不在遍历逻辑,而在“什么时候切层”。不能靠节点值判断,也不能依赖父子关系标记;唯一可靠依据是每轮循环开始时队列中剩余的节点数——它恰好等于当前待处理层的宽度。
示例片段:
立即学习“C++免费学习笔记(深入)”;