当前课程知识点:数据结构(上) > 第五章 二叉树 > (e1)先序遍历 > 05E1-8 迭代实现(2)
新的这个迭代算法
需要首先实现一个标准的例程
它的名字叫作visitAlongLeftBranch
顾名思义 它的任务就是来实现
我们刚才那样一个从根节点开始
沿着这个所谓的left branch 不断下行
依次访问沿途所有节点的这样一个过程
如果这个起始的根节点是x
那么我们可以看到 它要做的事情就是
每次都只需直接访问x节点
然后转入它的左孩子
直到这个左孩子为空
也就是抵达了left branch的终点
每当我们向下前行一步
都会相应地将X当前的右孩子
推入到事先准备好的某一个栈中
那么都是哪些右孩子呢?
第一个进栈的应该是根节点的右孩子
再往下呢 是它的左孩子的右孩子
以及它的左孩子的左孩子的右孩子
以及最终的末端节点的
也就是第d个节点的右孩子
因此如果将存放它们的那个栈画出来的话
大致是这样一个样子
也就是说 这是底部
而这边是栈的开放端 顶部
至此 我想你应该理解了
我们这里之所以使用一个栈
而不是一个队列的用意了
没错 依然是后进先出的特性
因为接下来
我们对这一系列的右子树的遍历次序
按照刚才的分析 应该是自底而上的
对于栈而言 就应该是自顶而向底的
所以我们接下来一系列的顺序Pop操作
Pop操作以及Pop操作
恰巧可以忠实地还原
我们所需要的这样一种访问的次序
那么这样的一个次序如何来兑现呢?
我们来看一下主算法
请记住 这个主算法
是反复地在每一个局部调用
visitAlongLeftBranch这个例程来实现
这就是我们的主算法
确实 它会反复地调用我们刚才的那个
visitAlongLeftBranch例程
而且传入的这个栈都是大家公用的
每一步迭代 我们都可以认为
是从这个栈中弹出一个当前的节点
并且命名为x
从语义上 我们可以理解为
是进入了以x为根节点的那样一棵子树
因此按照算法逻辑 应该紧接下来
调用visitAlongLeftBranch这个例程
对子树x的那个左侧分支进行访问
同时 它还会将对应的一系列的右子树
其实是它们的树根
通过这个栈逆向地收纳起来
仅此而已
最终一旦栈变空
这个算法也就随即退出
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验