第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)的操作之后![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/23f1418d34eb21e10820cfb4cafe3c51.png)
6.6赫夫曼树及其应用
6.6.1最优二又树(赫夫曼树)
具有不同带权路径长度的二叉树
编制一个将百分制转换成五级分制的程序(条件语句)
上述程序的判定过程![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0b43af1da3bec4cc9018ce117aba1a59.png)
假设学生成绩的等级分布规律如下表所示:
假定以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