目录
何谓线索二叉树?
线索链表的遍历算法
如何建立线索链表?
何谓线索二叉树?遍历二叉树的结果是,求得结点的一个线性序列,例如:
遍历引起的思考:
遍历二叉树把非线性结构以序列的形式加以“线性化”了,那么
◆所得序列信息可否长期利用?
◆信息保持可否尽量少占用额外的存储空间?
◆是否能否形成一般化的方法?
处理办法:在遍历时,串联起前驱、后继的关系链,以备后期的再利用。
指向该线性序列中的“前驱”和“后继”的指针,称作“线索”
包含“线索”的存储结构,称作“线索链表”
与其相应的二叉树,称作“线索二叉树”
按“序”来讲,可分成:“先序线索二叉树”、“中序线索二叉树”和“后序线索二叉树”
线索二叉树
类型定义
中序线索化二叉树示例
线索关系表现为双向循环链表
查找前驱和后继变得异常容易
线索链表的遍历算法:
遍历带有线索的二叉树,既无需重新递归遍历,也无需栈的协助,只进行相当“线性结构”的寻访即可,而且可正反双向进行
如何建立线索链表?
建立中序线索化的过程,是在中序遍历的过程中串联起前驱和后继的线索指针链
树和森林
树和森林的定义
树和森林的存储结构
树和森林的遍历
树的定义:
树是n(n≥0)个元素的有限集D,若D为空集,则为空树。否则:
(1) 在D中存在唯一的称为根的数据元素root;
(2) 当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1, T2, ..., Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。
有向树:
(1) 有确定的根;(2) 树根和子树根之间为有向关系
有序树:
子树之间存在确定的次序关系
无序树:
子树之间不存在确定的次序关系。
森林:是m(m≥0)棵互不相交的树的集合
任何一棵非空树是一个二元组Tree = (root,F)其中:root 被称为根结点F被称为子树森林
树和森林的存储结构
1.双亲表示法2.孩子链表表示法3.树的二叉链表(孩子-兄弟)存储表示法
1.双亲(数组)表示法
树的一种顺序存储结构,将树中的结点按照从上到下,从左到右的顺序存放在一个一维数组中,每个数组元素中存放一个结点的信息,包括该结点本身的信息和该结点的双亲的位置信息即双亲的下标值。
2.孩子链表表示法
孩子表示法是树的一种链式存储结构。
(1)指针方式的孩子表示法(多重链表):每个结点有多个指针域,分别指向其子树的根结点同构:结点的指针个数相等,为树的度D结点不同构:结点指针个数不等,为该结点的度d
(2)孩子链表:每个结点的孩子结点用单链表存储,再用含n个元素的结构数组指向每个孩子链表。
孩子兄弟表示法(二叉树表示法)
树转换为二叉树
将一棵树转换为二叉树,要经过以下四个步骤:
(1)在树中所有相邻兄弟之间加一条连线。
(2)对树中的每个结点,只保留它与第一个孩子结点之间的连线,抹去它与其它孩子结点之间的连线。
3)把所有的连线拉成横平竖直。
(4)以树的根结点为轴心,将整棵树顺时针转动45°的角度,使之结构层次分明。
树的二叉链表(孩子-兄弟)存储表示法
3.孩子兄弟表示法(二叉树表示法)
用二叉链表作树的存储结构,链表中每个结点除了包含该结点本身的值域外,还要设置两个指针域分别指向其第一个孩子结点和下一个兄弟结点
由此,树的各种操作均可对应二叉树的操作来完成。应当注意的是,和树对应的二叉树,其左、右子树的概念已改变为:左是孩子,右是兄弟。
树的应用堆排序的实现//后序章节二叉排序树//后序章节哈夫曼树及其应用105
哈夫曼树及其应用
最优树的定义
如何构造最优树
前缀编码
最优树的定义
1树的路径长度定义为:
树中每个结点的路径长度之和。
2结点的路径长度定义为:
从根结点到该结点的路径上分支的数目。
3树的带权路径长度定义为:树中所有叶子结点的带权路径长度之和
在所有含n 个叶子结点、并带相同权值的m 叉树中, 必存在一棵其带权路径长度取最小值的树,称为“最优树”
如何构造最优树(赫夫曼算法) 以二叉树为例:
(1)根据给定的n 个权值
{w1, w2, ..., wn}
构造n 棵二叉树的集合
F= {T1, T2, ... , Tn}其中每棵二叉树中均只含一个带权值为wi 的根结点,其左、右子树为空树;
(2)
在F 中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和;
(3)从F中删去这两棵树,同时加入刚生成的新树;
(4)重复(2)和(3)两步,直至F 中只含一棵树为止
前缀编码
指的是,任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
利用哈夫曼树可以构造一种不等长的二进制编码,并且构造所得的哈夫曼编码是一种最优前缀编码,即使所传电文的总长度最短
哈夫曼树
1952年,数学家D.A.Huffman提出了用字符在文件中出现的频率来构建一个用0,1二进制串表示各字符的最佳编码方式,称为Huffman编码。哈夫曼编码很好的解决不等长编码的两个关键问题,广泛地应用于数据压缩,尤其是远距离通信和大容量数据存储。哈夫曼编码的基本思想是以字符的使用频率作为权构建一棵哈夫曼树,然后利用哈夫曼树对字符进行编码。
注:不等长编码的关键问题1、频率越高,编码越短。2、不能有二义性(前缀码特性)
构造一棵哈夫曼树,是将所要编码的字符作为叶子结点,该字符在文件中的使用频率作为叶子结点的权值,以自底向上的方式,通过n-1次的“合并”运算后构造出的树。核心思想是让权值大的叶子离根最近。
哈夫曼算法采取的贪心策略是每次从树的集合中取出没有双亲且权值最小的两棵树作为左右子树,构造一棵新树,新树根节点的权值为其左右孩子结点权值之和,将新树插入到树的集合中。
算法设计
概述1.确定合适的数据结构。
•哈夫曼树中没有度为1的结点,则一棵有n个叶子结点的哈夫曼树共有2n-1个结点(n-1次的“合并”,每次产生一个新结点)。
•构成哈夫曼树后,为了获得编码需从叶子结点出发走一条从叶子到根的路径。
•译码需要从根出发走一条从根到叶子的路径。那么对于每个结点而言,需要知道每个结点的权值、双亲、左孩子、右孩子和结点的信息。
1. 熟练掌握二叉树的结构特性,了解相应性质的证明方法。
2. 熟悉二叉树的各种存储结构的特点及适用范围。
3. 遍历二叉树是二叉树各种操作的基础。实现二叉树遍历的具体算法与所采用的存储结构有关。掌握各种遍历策略的递归算法,灵活运用遍历算法实现二叉树的其它操作。
4. 理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系,熟悉二叉树的线索化过程。
5.了解最优树的特性,掌握建立最优树和哈夫曼编码的方法
资料仅供学习使用
编者能力有限,如有错误欢迎留言交流
编者的其他专栏:
关注编者了解更多