当前课程知识点:数据结构(上) > 第五章 二叉树 > (e4)层次遍历 > 05E4-3 实例
以下我们就通过这样一个具体的实例
来加深对以上层次遍历过程的理解
我们的遍历起始于
当前这棵树的根节点A
按照刚才的算法设计
我们需要引入一个队列
作为初始化 我们首先要令根节点A入队
为了便于此后的对比
我们此时不妨为这个队列拍张照片
以下将进入主体的while循环
你应该记得 每次循环都会通过dequeue()
取出队首的节点并且对它进行访问
此时呢 对应的就是节点A
因此接下来deque()
并且随即访问A
请注意 在这个瞬间 队列是空的
同样地 为了便于日后对比
也在此时留下一张照片
在进入下一步迭代之前
我们需要左顾右盼
我们发现刚被访问的节点A
只有一个左孩子B
因此需要令它入队
然后才进入下一步迭代
同样地 也需要留下一张照片
接下来的这步迭代中
我们依然需要通过一次dequeue()操作
取出队首节点
在此时 对应的就是B
并且对它进行访问
依然留张照片
好 接下来站在节点B处
我们依然要左顾右盼
发现左右孩子都在
因此我们需要令它们入队
请注意 我们这里入队的次序
是左先右后
你应该还记得 在此前先序遍历的
第一个迭代版本中
我们同样借助了一个栈
而且在每个节点刚被访问完之后
也同样需要左顾右盼
并且令它的左孩子和右孩子
如果它们有的话 入栈
你应该还记得那个时候
我们的次序是右先左后
与这里的左先右后相对比
你不难理解
因为此前使用的栈具有先进后出的性质
而这里的队列恰好是先进先出
所以我们并不需要
像此前的先序遍历那样
在缓存孩子节点的时候
需要将它们的次序颠倒
因此这里的左孩子C和D
应该先后入队
同样 我们这里留张照片以备日后对比
接下来 进入到下一步迭代dequeue()
取出并且随即访问队首的节点C
同样地 这里也有一个过门
左顾右盼
只不过遗憾地发现
它们都是空的
所以并没有任何实质的动作
从而紧接着转入下一次迭代
当然在此之前
我们依然需要留张照片
好了 接下来
下一步迭代
依然是dequeue()
取出队首节点并且随即访问
好
在此时刻
同样 留张照片
接下来 左顾右盼以后
发现它的左孩子、右孩子E和F都在
依次令它们入队
从而再进入下一步迭代
依然需要做一次dequeue()操作
并且再次地留张照片
下一步迭代 我们依然需要做dequeue()操作
取出队首的节点 也就是E
并且访问
好
同样地 我们也需要留张照片
以下站在E这个位置
我们依然需要左顾右盼
我们发现只有右侧的孩子G
同样地 令G入队
这个时候的照片是这样
好 下一步迭代
依然是从dequeue()操作开始的
取出队首的F
并且轮到它接受访问
为此 我们也留一张照片
此时的队中的状态是这样
再接下来 站在F的位置左顾右盼
结果与刚才的C是一样的
只是过门 没有任何实质的动作
所以进入下一步迭代
这一步迭代依然是从dequeue()开始的
也就是取出队首的节点G
并随即访问
此时继续留一张当时的照片
接下来 站在G这个位置
经过同样地左顾右盼
我们会发现
并没有任何实质的工作需要做
因此我们就直接进入下一步迭代
而此时我们的队列恰好已经变空
这就意味着整个这棵树的层次遍历
已经完成
算法可以顺利地退出
在事后 我们通过这样一组照片
可以忠实地还原整个的过程
并体味在此过程中整个数据结构
以及算法状态的演化过程
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验