当前课程知识点:数据结构(上) > 第五章 二叉树 > (e1)先序遍历 > 05E1-3 递归实现
其实从递归的角度来看
以上三种典型的遍历策略 都并不难实现
因为它们的定义本身就是递归式的
以先序遍历为例
只需短短的四句就可以忠实的实现
先序遍历整体策略
其中的第一句是对退化情况
也就是递归基来做处理
对于任何一个递归函数来说
这都是非常重要的
而且是首当其冲的
这就犹如你在开车之前
首先要系上安全带一样
当然以下蕴含着一个else分支
也就是说 当前子树非空
以下的处理才是有意义的
具体来说 既然是先序遍历
那我们就需要首先将树根节点取出
并且进行访问
接下来呢 递归地对左子树
也就是以左孩子为根的那棵子树进行遍历
以及再递归地对以右孩子为根的那棵子树
也就是右子树做递归遍历
从而整体地完成对整树的遍历
通过这样一个简明的递推式
我们可以严格地证明
这个算法具有线性的时间复杂度
我们甚至可以说
这已经是不能再好的结果了
的确如此 然而这只具有渐近的意义
在实际的运行过程中
因为递归程序的实现机制
并不可能做到针对具体的问题
来量体裁衣 而只能采用通用的方法
在运行栈中
尽管每一个递归实例都的确只对应于一帧
但是因为它们必须具有通用格式
所以并不能做到足够的小
而针对于具体的问题
只要我们能够进行精巧的设计
完全是可以使得每一帧做到足够小的
尽管从big O的意义上讲
这两种策略所对应的每一帧
都可以认为是常数
但是这种常数的差异 实际上是非常巨大的
因此作为树算法的一个重要基石
遍历算法非常有必要从递归形式
改写为迭代形式
同时 从学习者的角度
经过这样的改写之后
我们也可以对整个遍历算法的过程
以及原理获得更加深刻的认识
稍加观察 我们不难发现
此处的两句递归调用
都非常类似于我们所谓的尾递归
其特征是递归调用出现在
整个递归实例体的尾部
这种递归是非常容易化解为迭代形式的
为此我们只需引入一个栈
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验