当前课程知识点:数据结构(上) > 第五章 二叉树 > (e2)中序遍历 > 05E2-3 思路
与先序遍历同理
我们可以将任何一棵二叉树抽象地
规范为如图所示的形式
也就是说 整棵树必然可以分解为
一条起自根节点的左侧链
以及左侧链上各节点所对应的
右孩子 右子树
左侧链 右孩子 右子树
左侧链 右孩子 右子树
以及左侧链 右孩子 右子树
无非如此
当然也同样地
其中某些右孩子
可能并不存在
或者等效地认为某些右子树
可能是空的 但这并不要紧
如此我们可以发现在任何一个局部
当控制权转移到当前的树根节点
这个节点并不是立即接受访问
而是形象地说 它会将这个控制权
谦让给它的左孩子
而直到它的左孩子接受访问之后
才会继续深入到它的右子树中
而接下来 只有在这棵右子树
也被遍历完毕之后
控制权才会重新地回到此前的根节点处
而只有在这个时候
这个根节点才会欣然接受访问
这样一个局部的次序模式
如果转化为整个这样的一棵树的话
那么必然就会导致这样的一个总体次序
而整棵树的遍历过程呢
可以由此分为若干个阶段
我们来看一下 正像我们刚才所说的
首先接受访问的应该是左侧链的末端
也就是沿着左侧链向下行进的终点
在刚才那个例子中 命名为a
它被访问之后 继而它的右子树将被遍历
此后控制权才重新地回到
此前谦让于Ld的上层节点Ld-1
请注意 在d-1重新接过控制权的这个时刻
Ld以及它的右子树Td都已经被访问完毕
什么叫访问完毕呢?
我们既可以认为它们被访问完毕
同时也可等效地认为
它们根本就未曾存在过
而如果它们确实没有存在的话
相对于由剩余的部分所构成的这棵树
首先第一个被访问的节点
也确实就应该是Ld-1
于是接下来 无论是根据算法的基本策略
还是我们站在新的角度所形成的理解
都应该是继而访问新的这个末端节点
并且进而遍历它的右子树
在所有这两步完成之后
才将控制权重新地交还给此前
谦让过的祖先节点
请注意 这依然等效于我们在这个地方
进行了一次截除
如果控制权果真回到这个位置
我们完全可以等效地理解为
它左侧的那些后代根本就未曾存在过
继续按照这种理解 我们可以认为
要访问这一部分
以及进而访问这部分
直到最终访问全树
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验