【数据结构】二叉树的遍历:层次遍历

考点频率:★★★★☆(选择题常考,与三种深度优先遍历对比考查)
难度:⭐⭐
建议:重点掌握层次遍历的队列实现思路,理解其与递归遍历的区别

1️⃣ 什么是层次遍历?

层次遍历(Level Order Traversal)是按照二叉树的从上到下、从左到右的顺序,逐层访问每个节点。

打个比方:层次遍历就像按楼层检查一栋楼——先检查一楼所有房间(从左到右),再检查二楼所有房间,然后是三楼……每层都从左到右,一层一层往下走。而前序/中序/后序遍历像走迷宫——你可能先走到三楼的最深处,再回到一楼。

前面讲的前序、中序、后序遍历都属于深度优先遍历(DFS)——顺着一条路径走到头,再回溯。而层次遍历是广度优先遍历(BFS)——先访问离根近的节点,再访问离根远的节点。

2️⃣ 层次遍历的核心:队列

为什么用队列?

因为层次遍历要求“先访问的节点,先处理它的子节点”,这正好符合先进先出(FIFO)的特性——这正是队列的核心特征。

基本思路

  1. 将根节点入队
  2. 只要队列不为空,就重复以下操作:
    • 从队头取出一个节点,访问它
    • 如果它有左子节点,将左子节点入队
    • 如果它有右子节点,将右子节点入队

3️⃣ 层次遍历的执行过程(详细演示)

对下面这棵树进行层次遍历:

1 / \ 2 3 / \ \ 4 5 6

步骤演示

步骤队列(队头→队尾)访问输出操作
初始[1]根节点入队
第1步[2, 3]1取出1,将2和3入队
第2步[3, 4, 5]1, 2取出2,将4和5入队
第3步[4, 5, 6]1, 2, 3取出3,将右子节点6入队(无左子节点)
第4步[5, 6]1, 2, 3, 4取出4,无子节点
第5步[6]1, 2, 3, 4, 5取出5,无子节点
第6步[]1, 2, 3, 4, 5, 6取出6,无子节点

最终结果1 2 3 4 5 6

4️⃣ 层次遍历的算法(伪代码)

voidLevelOrder(BiTree T){if(T==NULL)return;Queue Q;// 创建一个队列EnQueue(Q,T);// 根节点入队while(!IsEmpty(Q)){BiTNode*p=DeQueue(Q);// 取出队头Visit(p->data);// 访问该节点if(p->lchild!=NULL){EnQueue(Q,p->lchild);// 左子节点入队}if(p->rchild!=NULL){EnQueue(Q,p->rchild);// 右子节点入队}}}

时间复杂度O(n)O(n)O(n)(每个节点入队一次、出队一次)
空间复杂度O(n)O(n)O(n)(队列最多存储一层的节点数)

5️⃣ 层次遍历 vs 三种深度优先遍历(重要对比)

对比项前序中序后序层次遍历
遍历顺序根→左→右左→根→右左→右→根上→下,左→右
实现方式递归(或栈)递归(或栈)递归(或栈)队列
本质深度优先(DFS)深度优先(DFS)深度优先(DFS)广度优先(BFS)
根的位置第一个中间最后一个第一个
适用场景复制树结构二叉排序树排序删除树求树宽、判断完全二叉树

关键区别:深度优先遍历用(递归本质上就是栈),层次遍历用队列。这是两者最核心的区别。

6️⃣ 层次遍历的应用场景

应用场景说明
求二叉树的高度每遍历完一层,高度+1
求二叉树的宽度统计各层节点数,取最大值
判断是否为完全二叉树层次遍历中,如果遇到空节点后还能遇到非空节点,则不是完全二叉树
寻找二叉树中最左/最右节点层次遍历的每一层第一个/最后一个节点
树的图形化打印按层输出节点值

例题:利用层次遍历判断完全二叉树

  • 完全二叉树的特点:在层次遍历中,一旦遇到NULL空位,后面不应该再出现非空节点
  • 按层遍历时,如果遇到空节点,则记录一个标志位;若之后又遇到非空节点,说明不是完全二叉树

7️⃣ 经典例题

例题1:对下面这棵二叉树进行层次遍历,结果是什么?

A / \ B C / \ \ D E F

解析

  • 第1层:A
  • 第2层:B, C
  • 第3层:D, E, F
  • 层次遍历结果:A B C D E F

答案A B C D E F


例题2:某二叉树的层次遍历序列为1 2 3 4 5 6,这棵二叉树不可能是( )。

A. 满二叉树
B. 完全二叉树
C. 只有右子树的树
D. 以上都有可能

解析1 2 3 4 5 6是层次遍历序列,它描述了各层从左到右的访问顺序。层次遍历序列不能唯一确定一棵二叉树,但它必须符合“上层先于下层、左兄弟先于右兄弟”的约束。只有右子树的树(每个节点只有右子节点)的层次遍历为1 2 3 4 5 6,完全可能。选D


例题3(判断):层次遍历可以使用栈来实现。( )

解析:错误。层次遍历使用队列(FIFO)来实现广度优先搜索。如果使用栈,会变成深度优先遍历。

8️⃣ 记忆口诀

层次遍历用队列,根节点先入队。
出队访问后入子,左先右后别弄反。
深度优先用递归,广度优先用队列。

9️⃣ 小测验(评论区对答案)

用层次遍历求一棵二叉树的高度时,每遍历完一层需要( )。
A. 将队列清空
B. 在队列末尾插入一个特殊标记(如NULL
C. 重新从根节点开始
D. 将当前层的所有节点出队后再统计

答案下期公布。

🔔本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #层次遍历 #二叉树 #数据结构 #软考备考