当前课程知识点:数据结构 >  第6章 树和二叉树 >  6.4 遍历二叉树 >  6.4 遍历二叉树(2)

返回《数据结构》慕课在线视频课程列表

6.4 遍历二叉树(2)在线视频

下一节:6.5 线索二叉树

返回《数据结构》慕课在线视频列表

6.4 遍历二叉树(2)课程教案、知识点、字幕

同学们大家好

我是云南大学信息学院教师孔兵

这节课我们继续讨论遍历二叉树

关于二叉树的遍历,有一个问题是经常会遇到

就是已知二叉树的先序序列和中序序列

画出这棵二叉树

原问题就是要依据先序和中序序列画出这颗二叉树

这里仍然是利用递归分解的办法来做

把画二叉树的问题,分解为三个子问题

一是画出二叉树的根,随后画出二叉树的左子树

再画出二叉树的右子树

这三个子问题解决了

画二叉树的问题也就解决了

我们具体看一下怎么做

我们以前一张幻灯片中的二叉树为例

现在已知的条件是二叉树的先序ABDEGCF和中序DBGEAFC

在最上面的方框中

我在序列中加了几个空格

目的是让大家观察的清楚一些

空格不说序列的一部分

按照递归分解,先画根

从先序策略我们知道

先序序列中第1个被访问的

就是整棵树的根,依据先序序列

可以画出整棵二叉树的根A,如图1所示

随后在中序序列中找到整棵树的根A

A左边的4个结点是A左子树的中序序列

从中序策略我们知道

A左边的4个结点是A左子树的中序序列

这个左子树结点个数很重要

我们就是依据它

从先序序列中A后面找出4个结点

按先序策略,这是A左子树的先序序列

如A左子树的框中所示

我们得到了A左子树的先序序列是BDEG

中序序列是DBGE

同时对称的

可以知道A右子树的先序序列是CF

中序序列是FC

大家可能注意到,现在我们的问题递归了

变成依据A左右子树的先序和中序

画出左右子树两个同类型的子问题

例如,画出A的左子树

依据左子树的先序序列是BDEG

可以画出左子树的根B

如图2所示,在A左子树的中序序列DBGE找B

在A左子树的中序序列DBGE中,找B

利用同样的方法

可以确定B左右子树的中序和先序

递归过程可以继续下去

图3,4给出了画A左图,图3,4给出了左子树的后序过程

同学们自己考虑一下

画A右子树过程类似

如果已知二叉树的后序序列和中序序列

也可以用类似的方法画出二叉树

但是,同学们要注意,已知先序和后序序列

是无法画出二叉手的

举个反例,先序序列是AB

后序序列是BA。不管是通过先序还是后序

都可以画出整棵树的根是A

但是,无法确定B到底是A的左孩子还是右孩子

之所以我们重点讨论这个问题

主要目的是为了实现二叉树的存储

线性表输入计算机是很容易的

按照序列次序输入即可,即输入了元素

也蕴含了关系

二叉树的输入就麻烦些

通过输入先序和后序序列是一种有效的方法

两个序列中除了包含树中元素外

按上面的讨论,它们还蕴含了结点之间的关系

可以基于上面讨论的过程

设计算法建立二叉树的存储结构

下面看一下程序的实现

以先序遍历为例,函数的返回值是执行状态

表示遍历成功与否

涉及到的参数有两个

一个是指向要遍历二叉树根结点的指针T

标明遍历的对象

一个是指向函数的指针visit

目的是通过调用visit所指的函数

对正在访问的结点进行处理

进入函数,如果T为空

那么是空树,else直接返回ok

空操作,如果T非空,进入一个复合语句

有3个嵌套的标为红色的IF语句

第一个If的条件表达式中是通过调用visit所指函数

访问根结点,这是先序遍历

调用返回有两种情况,访问如果不成功

返回error,说明遍历已经失败

后续遍历没有意义了

从绿色块的return Error返回

访问如果成功,返回OK,则进入第2个if语句

第2个if语句条件表达式是递归先序遍历左子树

如果遍历左子树的时候失败,返回Error

同样通过绿色块的return Error返回

如果左子树遍历是成功的,返回OK

则执行第3个if语句

条件表达式是递归先序遍历右子树

右子树访问如果失败,返回Error

仍然通过绿色块的return Error返回

如果右子树的遍历是成功的

返回OK,此时我们才return OK

表示对整棵树的遍历成功完成

如果要实现中序遍历,只需要在先序遍历函数中

把第1个if语句的条件表达式和第2个if语句的条件表达式部分对调即可

要实现后序,只需要在先序遍历函数中

把第1个if语句的条件表达式和第3个if语句的条件表达式部分对调即可

这里就不具体讨论了

从上面的讨论当中,我们注意到

因为,树结构本身就有递归特点

所以用递归的方法处理起来比较简单

看一个例子

编写递归算法,计算二叉树中

叶子结点的数目。这个问题可以进行递归分解

原问题是计算二叉树中叶子结点的树木

这个问题可以分解为两个同类型的子问题

计算左子树叶子结点的数目

计算右子树叶子结点的数目

这两个问题解决后

把二者结果相加即为整棵树叶子结点的数目

看一下函数,函数的返回值是个整棵树叶子结点的数目

参数只有一个,就是指向二叉树根结点的指针bt

如果指针为空,这是一颗空树

没有叶子,返回0

否则,如果根结点的左右孩子指针为空

这是一个叶子,返回1

再否则,递归调用

计算根结点左右子树叶结点的数目

随后return二者相加的结果

作为整棵树叶子结点的数目

再看一个例子

二叉树的遍历,除了前面讨论的先序

中序和后序的遍历策略以外

还有一种遍历的策略是按层次顺序

也就是按照树的层次结构,自上而下

自左至右访问树中的结点

在第7章图中

我们会介绍图的一种遍历策略叫广度优先搜索策略

到时候大家再转回来看一下

会发现,二叉树的层序遍历

就是广度优先搜索策略的一个简化应用

好同学们

这节课我们就介绍到这儿

下次课再见

数据结构课程列表:

前言

-1.算法概念导入

--1.1 算法概念导入

-2.数据结构课程介绍

--2.数据结构课程介绍

-数据结构前言PPT

第0章 预备知识

-0.1变量、类型和表达式

--0.1变量、类型和表达式

-0.2 函数

--0.2 函数

-0.3 指针和单链表

--0.3 指针和单链表

-0.4 数组、指向函数的指针

--0.4 数组、指向函数的指针

-第0章 预备知识讨论题

-数据结构第0章预备知识PPT

第1章 绪论

-1.1什么是数据结构

--1.1什么是数据结构

--测试题

-1.2基本概念和术语

--1.2基本概念和术语

--测试题

-1.3数据结构的描述

--1.3数据结构的描述

--测试题

-1.4抽象数据类型的定义和实现

--1.4抽象数据类型的定义和实现

--测试题

-1.5算法和算法分析概念

--1.5算法和算法分析概念

--测试题

-1.6算法分析示例

--1.6算法分析示例

--测试题

-第1章 绪论讨论题

-数据结构第1章 绪论PPT

第2章 线性表

-2.1 线性表的类型定义

--2.1线性表的类型定义

--测试题

-2.2线性表的顺序表示和实现

--2.2 线性表的顺序表示和实现

--测试题

-2.3 线性链表

--2.3 线性链表

--测试题

-2.4 静态链表

--2.4 静态链表

--测试题

-2.5 循环链表和双向链表

--2.5 循环链表和双向链表

--测试题

-第2章 线性表讨论题

-数据结构第2章线性表PPT

第3章 栈和队列

-3.1 栈

--3.1栈

--测试题

-3.2 栈的实现

--3.2 栈的实现

--测试题

-3.3 栈的应用

--3.3 栈的应用

-3.4 栈与递归的实现

--3.4栈与递归的实现

--测试题

-3.5 队列和链队列

--3.5 队列和链队列

--测试题

-3.6 循环队列

--3.6 循环队列

--测试题

-第3章 栈和队列讨论题

-数据结构第3章栈和队列PPT

第4章 串

-4.1 串

--4.1 串

--测试题

-数据结构第4章 串PPT

第5章 数组

-5.1 数组定义和表示

--5.1 数组定义和表示

--测试题

-5.2矩阵的压缩存储

--5.2 矩阵的压缩存储

--测试题

-第5章 数组讨论题

-数据结构第5章数组PPT

第6章 树和二叉树

-6.1 树的定义和基本术语

--6.1 树的定义和基本术语

-6.2 二叉树和二叉树的性质

--6.2 二叉树和二叉树的性质

--测试题

-6.3 二叉树的存储结构

--6.3二叉树的存储结构

--测试题

-6.4 遍历二叉树

--6.4 遍历二叉树(1)

--6.4 遍历二叉树(2)

--测试题

-6.5 线索二叉树

--6.5 线索二叉树

--测试题

-6.6 树的存储

--6.6树的存储

-6.7 树的转换和遍历

--6.7 树的转换和遍历

--测试题

-6.8 赫夫曼树

--6.8 赫夫曼树

-6.9 赫夫曼编码

--6.9 赫夫曼编码

--测试题

-第6章 树和二叉树讨论题

-数据结构第6章树和二叉树PPT

第7章 图

-7.1 图的定义和术语

--7.1.1图的定义和术语(1)

--7.1.2图的定义和术语(2)

--测试题

-7.2 图的存储结构

--7.2.1 数组表示法(1)

--7.2.2 数组表示法(2)

--7.2.3 邻接表

--测试题

-7.3 图的遍历

--7.3.1 深度优先搜索

--7.3.2 广度优先搜索

--测试题

-7.4 最小生成树

--7.4.1 普里姆算法

--7.4.2 克鲁斯卡尔算法

--测试题

-7.5 有向无环图

--7.5.1 拓扑排序

--7.5.2 关键路径

--测试题

-7.6 最短路径

--7.6.1 单源最短路径-迪杰斯特拉算法

--7.6.2 每一对顶点之间的最短路径-弗洛伊德算法

--测试题

-第7章 图讨论题

-数据结构第7章图PPT

第8章 查找

-8.1 查找基本概念和顺序查找

--8.1 查找基本概念及顺序查找

--测试题

-8.2 有序表的查找

--8.2 有序表的查找

--测试题

-8.3 二叉排序树

--8.3.1 二叉排序树(1)

--8.3.2 二叉排序树(2)

--测试题

-8.4 平衡二叉树

--8.4 平衡二叉树

--测试题

-8.5 哈希表

--8.5.1 哈希表及哈希函数的构造

--8.5.2 解决冲突的方法

--8.5.3 哈希表的查找和性能分析

--测试题

-第8章 查找讨论题

-数据结构第8章查找PPT

第9章 内部排序

-9.1插入排序

--9.1.1 插入排序(1)

--9.1.2 插入排序(2)

--测试题

-9.2 希尔排序

--9.2 希尔排序

--测试题

-9.3 快速排序

--9.3 快速排序

--测试题

-9.4 选择排序

--9.4 选择排序

--测试题

-9.5 堆排序

--9.5 堆排序

--测试题

-9.6 归并排序

--9.6 归并排序

--测试题

-9.7 基数排序

--9.7 基数排序

--测试题

-9.8 排序方法总结

--9.8 排序方法总结

-第9章 内部排序讨论题

-数据结构第9章内部排序PPT

6.4 遍历二叉树(2)笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。