当前课程知识点:数据结构(上) > 第五章 二叉树 > (e1)先序遍历 > 05E1-6 新思路
我们不妨从一个规模略大
同时也更具一般性的例子入手
我们可以看到 对这样一个具体的例子而言
先序遍历将首先访问全树的树根 也就是i
接下来 我们应该转入并且访问
它的左子树的树根 也就是d
再接下来 应该访问d的左子树
也就是它的树根c
再接下来 访问它的左子树a
因为a并没有左子树
所以接下来 应该将控制权交给它的右子树
也就是节点b
好 当b被访问完之后
左右孩子都没有
所以我们应该回溯
那么回溯到哪儿呢?
回溯到a a已经被访问完了
回溯到c c也被访问完了
回溯到d d也被访问完了
但是d与c和a不同 它访问完之后
它还留有一个尚未访问的右孩子
所以我们说这个时候的控制权
应该从b转交给h
h一旦获得了这个控制权之后
它除了访问自己以外
接下来 又会将访问权转交给它的左孩子
它的左孩子也将被访问
并且继而将访问权交给它的左孩子
同样 当它的左孩子访问完了之后
这个孩子试图将控制权交还给f
但是f会随即将它转让给自己的右孩子
也就是刚才那个左孩子的兄弟
所以我们说 从e接下来应该访问的是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)深度优先搜索--作业
-第六章 图--本章测验