当前课程知识点:数据结构(上) > 第五章 二叉树 > (e1)先序遍历 > 05E1-9 实例
最后我们通过这样一个实例
来对刚才那个算法获得更为具体的认识
当然在继续之前
我强烈的建议你熟读刚才的主算法
以及那个子算法
甚至不妨将它们背诵下来
准备好了吗?
那么我们接下来就来一边对照这个例子
一边背诵刚才那段算法
整个算法始自于树根 也就是a
按照刚才的算法逻辑
我们将首先调用
visitAlongLeftBranch那个例程
首先访问始自于a的这样一段左侧链
我们可以看到 此时只包含a和b两个节点
所以这也是为什么a和b会被依次访问掉
请注意 这个子程序在访问a和b的同时
还会将它们的右孩子 也就是c
以及节点b的那个看不见的空的右孩子
推入栈中
我们可以清晰地看到
在我们访问a的时候 会将c推入栈中
在我们接下来访问b的时候
会将一个空节点也推入栈中
因此在主程序接下来的一步中
首先会弹出栈顶 也就是这个空节点
并且试图以这个空节点为起点去调用一次
visitAlongLeftBranch那个例程
然而我们会看到 这只是一个过门
不会有任何实质的动作
因为这个例程会首先检测
当前的x是否为空
一旦为空 它就会立即返回
所以我们主程序的下一步迭代
将弹出当前的栈顶节点c
并且同样地会在以c为根的子树中
调用一次visitAlongLeftBranch这个例程
依次地访问当前左侧链上的c以及d
请记住同样地 在访问c和d的同时
还会将c的右孩子 也就是f
以及d的右孩子e 依次地推入栈中
再接下来 新的栈顶节点e将会被弹出
并且同样地会试图以它为起点
针对它所对应的那棵子树
其实现在是一棵退化的子树
调用一趟visitAlongLeftBranch例程
我们可以发现 既然这是一棵退化的树
那么自然也就没有真实的任何右子树
实际上 只会将e的那棵实际为空的右子树
推入栈中
同样这样一个空节点的入栈以及出栈
在整个算法过程中 只不过是过门
它并不会有任何实质的动作以及输出
因此在接下来的一轮迭代中
新的栈顶 也就是f节点将会被弹出来
同样每当弹出一个新的节点
我们都会试图以它为起点去调用一次
visitAlongLeftBranch那个例程
相应地访问这个局部子树的
左侧链上的每一个节点
具体来说 这时也就是f和g
f和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)深度优先搜索--作业
-第六章 图--本章测验