当前位置: 首页 > news >正文

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

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

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. 将当前层的所有节点出队后再统计

答案下期公布。

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

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

http://www.jsqmd.com/news/1399193/

相关文章:

  • 企业微信推送配置:mimotion刷步结果实时通知教程
  • Pyforms事件处理机制详解:打造响应式用户界面
  • arena1/arena与传统malloc对比:谁才是高性能应用的最佳选择?
  • 一招看清招聘信息发布时间:Boss Show Time 插件让陈旧职位无处遁形
  • Discord 附件上传上限翻倍至 20MB,移动应用检查文件大小逻辑与桌面端统一
  • 7.2.5.3 SIB1 的承载方式
  • 零成本搭建企业管理系统:用ERPNext开源ERP 30分钟跑通销售全流程
  • 加密音乐解锁终极指南:免费开源的 Unlock Music 音乐解密工具完整使用攻略
  • reserved-usernames项目进阶:自定义格式生成与自动化集成技巧
  • 旧款Mac免费升级最新macOS:OpenCore Legacy Patcher保姆级实战指南
  • PostCSS与Material Design Lite:Relay Fullstack样式解决方案
  • PDF补丁丁完整指南:5个实战场景,把乱糟糟的PDF收拾得服服帖帖
  • Ghidra 12.1 新特性深度解析:调试器为何不再“一崩全崩“
  • 12款Typora主题一次装齐,DrakeTyporaTheme完整上手体验记
  • 微信聊天记录如何永久保存?WeChatMsg导出工具保姆级实测指南
  • IP-Adapter图像提示适配器完全指南:如何用一张参考图掌控SD与SDXL创作
  • 《开拓者:正义之怒》角色构建进阶指南:拆解新手最常踩的6个坑,从零到毕业轻松通关
  • tfcausalimpact:基于TensorFlow Probability的终极因果推断工具详解
  • IntelliJ IDEA 2018.3 本地授权服务器部署与激活原理深度解析
  • tidb数据库3主机分布式集群docker-compose离线部署
  • 让浏览器秒变 Markdown 专业阅读器:Markdown Viewer 完整安装与使用指南
  • PDF处理很麻烦?这款免费免安装的全能工具箱帮你一次搞定
  • OpenGlass 智能眼镜改装全攻略:25美元让普通镜架“长出“AI眼睛
  • 网盘直链下载怎么用?开源助手帮你免费获取8大网盘真实下载地址
  • 招聘时间展示插件Boss Show Time实测:30秒看穿岗位“新鲜度“,告别无效投递
  • Taste-Skill v2 新版本发布:一篇看懂 AI 界面告别“AI 味“的终极方案
  • 图表数据提取工具 WebPlotDigitizer 实战指南:三步从图片里挖出可用数据
  • AI写作论文工具横评:2026年哪款真正适合学术写作
  • notepad-- 代码折叠完整上手:5 分钟把千行代码压缩成一张“地图“
  • 磁盘总是悄悄变满?Krokiet 3分钟完成重复文件清理,找回被浪费的空间