首页/数据结构/04-tree/二叉树的层序遍历 🔗 在 Obsidian 中打开
数据结构 · 树与二叉树

二叉树的层序遍历

难度 ★★重要度 ★★ 考查频率 低 二叉树层序BFS队列
速查
层序遍历(广度优先)借助队列,从根开始逐层、从左到右访问结点。时间 $O(n)$,空间 $O(w)$($w$ 为最大宽度)。二叉树的层序遍历本质就是 BFS。

核心概念

层序遍历(Level-Order Traversal)也称广度优先遍历:从根结点开始,先访问第 1 层所有结点,再访问第 2 层,依次类推,同一层内从左到右

实现依赖一个队列(FIFO):访问某结点时,将其未访问的孩子按顺序入队,下一轮从队头取结点继续。

与 BFS 的关系把二叉树看作无权图,层序遍历就是 BFS 的特例:第 $k$ 层结点距根恰好 $k$ 条边。

算法

void LevelOrder(BiTree T) {
    if (!T) return;
    Queue Q; InitQueue(&Q);
    EnQueue(&Q, T);
    while (!QueueEmpty(Q)) {
        BiTNode *p = DeQueue(&Q);
        visit(p);
        if (p->lchild) EnQueue(&Q, p->lchild);
        if (p->rchild) EnQueue(&Q, p->rchild);
    }
}
关键细节孩子应在入队时标记已访问,避免重复入队。

常见变体

  • 逐层输出:记录每层结点个数,按层打印(或用空指针/计数值分层)。
  • 锯齿形(之字形)层序:偶数层从左到右、奇数层从右到左,可用双端队列或两个栈。
  • 求宽度:统计各层结点数的最大值。
  • 求深度:层序数即深度。

常见考法

题型① 给定二叉树,写出层序序列;② 用队列模拟层序遍历过程(常考“队列中元素变化”);③ 锯齿形层序;④ 求树的宽度/深度。

易错点

必记
  1. 层序用队列,不是栈(栈是 DFS/先序类)。
  2. 层序序列不能唯一确定一棵二叉树(缺空位信息)。
  3. 访问与入队顺序:先访问当前结点,再将其孩子入队。

核心结论

要点结论
数据结构队列
时间复杂度$O(n)$
空间复杂度$O(w)$(最大宽度)
本质二叉树上的 BFS

记忆卡片

层序遍历用什么结构?
队列(FIFO)。
层序序列能唯一确定二叉树吗?
不能,缺少空位信息。
时间/空间复杂度?
时间 O(n),空间 O(w)。
锯齿形层序怎么实现?
用双端队列或两个栈按层翻转方向。

交互动画 · 层序遍历(BFS)模拟

A B C D E F G
队列:
点击「播放」或「下一步」,观察队列如何逐层扩展访问 A→B→C→D→E→F→G

相关知识点

binary-tree-traversal

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。