第6章 树和二叉树

第6章树和二叉树

6.1树的定义和基本术语

树的示例

在这里插入图片描述

抽象数据类型树的定义

在这里插入图片描述
在这里插入图片描述

树的其他3种表示法

在这里插入图片描述

6.2二叉树

6.2.1二叉树的定义

抽象数据类型二叉树的定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二叉树的5种基本形态

在这里插入图片描述

6.2.2二又树的性质

特殊形态的二叉树(ab深度为4)

在这里插入图片描述

完全二叉树上结点及其左、右孩子结点之间的关系

在这里插入图片描述

6.2.3二叉树的存储结构

1.顺序存储结构

在这里插入图片描述
在这里插入图片描述

2.链式存储结构
二叉树的结点及其存储结构

在这里插入图片描述

二叉链表和三叉链表储存结构

在这里插入图片描述

二叉链表的定义和部分基本操作的函数原型说明

在这里插入图片描述

6.3遍历二叉树和线索二叉树

6.31遍历二叉树

算法6.1:先序遍历二叉树基本操作的递归算法在二叉链表上的实现

在这里插入图片描述

二叉树表示表达式

在这里插入图片描述

3种遍历过程示意图

在这里插入图片描述

两个中序遍历二叉树的非递归算法如算法6.2和6.3所示

在这里插入图片描述
在这里插入图片描述

6.3.2线索二叉树

在这里插入图片描述

线索二叉树及其存储结构

在这里插入图片描述

后序后继线索二叉树

在这里插入图片描述

二叉树的二叉线索存储表示

在这里插入图片描述

算法6.5:以双向线索链表为存储结构时对二叉树进行遍历的算法

在这里插入图片描述

算法6.6和6.7:中序遍历建立中序线索化链表的算法

在这里插入图片描述
在这里插入图片描述

6.4树和森林

6.4.1树的存储结构

1.双亲表示法

在这里插入图片描述

树的双亲表示法示例

在这里插入图片描述

2.孩子表示法
多重链表的结点可以有如下两种结点格式

在这里插入图片描述

另一种办法

在这里插入图片描述

图6.13的树的另外两种表示法

在这里插入图片描述

3.孩子兄弟表示法(二叉树表示法)
树的二叉链表(孩子-兄弟)存储表示

在这里插入图片描述

图6.15是图6.13中的树的孩子兄弟链表

在这里插入图片描述

6.4.2森林与二叉树的转换

树与二叉树的对应关系示例
在这里插入图片描述
森林与二又树的对应关系示例
在这里插入图片描述

1.森林转换成二叉树

在这里插入图片描述

2.二叉树转换成森林

在这里插入图片描述

6.4.3树和森林的遍历

1.先序遍历森林

在这里插入图片描述

2.中序遍历森林

在这里插入图片描述

6.5树与等价问题

确定等价类的算法中抽象数据类型 MFSet

在这里插入图片描述

集合的一种表示法

在这里插入图片描述

用双亲表示法作存储结构

在这里插入图片描述

算法6.8:查找函数操作的实现

在这里插入图片描述

算法6.9:归并操作的实现

在这里插入图片描述

“并”操作的一种极端情形

在这里插入图片描述

算法6.10:改进后的“并”操作算法

在这里插入图片描述

例6-1:

在这里插入图片描述

处理R中前7个等价关系时S的变化状况(图中省去了结点的数据域)

在这里插入图片描述

图6.21(a):和最后一个S状态相应的树的形态

在这里插入图片描述

算法6.11:算法6.8的改进

在这里插入图片描述

假设例6-1中R的第8个等价偶对为(8,9),则在执行fix(s,8)的操作之后在这里插入图片描述

6.6赫夫曼树及其应用

6.6.1最优二又树(赫夫曼树)

具有不同带权路径长度的二叉树

在这里插入图片描述

编制一个将百分制转换成五级分制的程序(条件语句)

在这里插入图片描述

上述程序的判定过程在这里插入图片描述
假设学生成绩的等级分布规律如下表所示:

在这里插入图片描述

假定以5,15,40,30和10为权构造一棵有5个叶子结点的赫夫曼树,则可得到如图6.24(b)所示的判定过程

在这里插入图片描述

将每个判定框的两次比较两次比较分开,我们得到如图6.23(c)

在这里插入图片描述

构造赫夫曼树(赫夫曼算法)
图6.24展示了图6.22(c)的赫夫曼树的构造过程。其中,根结点上标注的数字是所赋的权。

在这里插入图片描述

在这里插入图片描述

6.6.2赫夫曼编码

前缓编码:图6.25所得A、B、C、D的二进制前缀编码分别为0、10、110和111

在这里插入图片描述

又如何得到使电文总长最短的二进制前缀编码呢?
算法6.12:设定下述存储结构

在这里插入图片描述

算法6.13:从根出发遍历整棵赫夫曼树,求得各个叶子结点所表示的字符的赫夫曼编码

在这里插入图片描述

例6-2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.7回溯法树的遍历

例6-3:求含n个元素的集合的幂集。

在这里插入图片描述

求幂集p(A)的元素的过程可看成是依次对集合A中元素进行“取”或“舍(弃)”的过程,并且可以用一棵如图6.28所示的二叉树来表示

在这里插入图片描述

算法6.14:求幂集元素的过程即为先序遍历这棵状态树的过程

在这里插入图片描述

算法6.15:对算法6.14求精(设以线性表表示集合)

在这里插入图片描述

例6-4:求4皇后问题的所有合法布局(作为例子,我们将8皇后问题简化为4皇后问题)

求解过程中棋盘状态的变化情况(四叉树)

在这里插入图片描述

算法6.16:求所有合法布局的伪码算法

在这里插入图片描述

6.8树的计数

具有n个结点的不同形态的树有多少棵?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从二叉树的遍历已经知道,任意一棵二叉树结点的前序序列和中序序列是惟一的。反过来,给定结点的前序序列和中序序列,能否确定一棵二叉树呢?又是否惟一呢?由定义,二叉树的前序遍历是先访问根结点D,其次遍历左子树L,最后遍历右子树R。即在结点的前序序列中,第一个结点必是根D;而另一方面,由于中序遍历是先遍历左子树L,然后访问根D,最后遍历右子树R,则根结点D将中序序列分割成两部分:在D之前是左子树结点的中序序列,在D之后是右子树结点的中序序列。反过来,根据左子树的中序序列中结点个数,又可将前序序列除根以外分成左子树的前序序列和右子树的前序序列两部分。依次类推,便可递归得到整棵二叉树

例6-5:已知结点的前序序列和中序序列分别为

前序序列:ABCDEFG
中序序列:CBEDAFG
则可按上述分解求得整棵二叉树。
在这里插入图片描述

推论:具有n个结点的不同形态的二叉树的数目

图6.32所示两棵有8个结点的二叉树,它们的前序序列都是12345678,而(a)树的中序序列为32465178,(b)树的中序序列为23147685
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChaselWang

有用就点个赞吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值