树与二叉树的关系ppt课件_第1页
树与二叉树的关系ppt课件_第2页
树与二叉树的关系ppt课件_第3页
树与二叉树的关系ppt课件_第4页
树与二叉树的关系ppt课件_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、6.4.1 树的存储结构树的存储结构6.4.2 树、森林与二叉树的相互转换树、森林与二叉树的相互转换6.4.3 树与森林的转换树与森林的转换6.4 6.4 树、森林和二叉树的关系树、森林和二叉树的关系6.4.1 6.4.1 树的存储结构树的存储结构树的主要存储方法有:树的主要存储方法有:一、双亲表示法一、双亲表示法二、孩子表示法二、孩子表示法三、孩子兄弟表示法三、孩子兄弟表示法一、一、 双亲表示法:双亲表示法: 用一组连续的空间来存储树中的结点,每个结点用一组连续的空间来存储树中的结点,每个结点附设一个指示器指示其双亲结点在表中的位置,其结附设一个指示器指示其双亲结点在表中的位置,其结点的结构

2、如下:点的结构如下: 数据数据 双亲双亲DataParent1245637树的双亲表示法如下图:树的双亲表示法如下图:1615140302-11ParentData543210结点结点序号序号672双亲表示法的优点:双亲表示法的优点: 利用了树中每个结点根结点除外利用了树中每个结点根结点除外只有一个双亲结点的性质,使得查找某只有一个双亲结点的性质,使得查找某个结点的双亲结点非常容易。个结点的双亲结点非常容易。 双亲表示法的缺点:双亲表示法的缺点: 求某个结点的孩子时,需要遍历整求某个结点的孩子时,需要遍历整个表。个表。 #define MAX 100typedef struct TNode D

3、ataType data; int parent; TNode; 一棵树可以定义为:一棵树可以定义为:typedef struct TNode treeMAX; int nodenum; /*结点数结点数*/ ParentTree; 双亲表示法的结点结构定义:双亲表示法的结点结构定义:二、二、 孩子表示法:孩子表示法: 通常是把每个结点的孩子结点排列通常是把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。起来,构成一个单链表,称为孩子链表。n n个结点共有个结点共有n n个孩子链表叶结点的孩个孩子链表叶结点的孩子链表为空表)。子链表为空表)。 n n个结点的数据和个结点的数据和n n

4、个孩子链表的头个孩子链表的头指针又组成一个顺序表。指针又组成一个顺序表。 树的孩子链表表示法见树的孩子链表表示法见p175的图的图6.26孩子表示法示意图孩子表示法示意图:ABCDEFG1 A 2 B 3 C 4 D 5 E 6 F 7 Groot=1num=7 data fch75 6 2 3 4 0111335par带双亲的孩子表示法带双亲的孩子表示法:孩子表示法的结构定义:孩子表示法的结构定义:typedef struct ChildNode /* 孩子链表结点的定义孩子链表结点的定义 */int Child; struct ChildNode * next; ChildNode; ty

5、pedef struct /* 树的定义树的定义 */ DataNode nodesMAX; /* 顺序表顺序表 */ int root, num; /* 根结点指示及结点个根结点指示及结点个数数 */ ChildTree; typedef struct /* 顺序表结点的结构定义顺序表结点的结构定义 */DataType data; ChildNode * FirstChild ; DataNode;三、三、 孩子兄弟表示法孩子兄弟表示法 孩子兄弟表示法又称二叉链表表示法,表孩子兄弟表示法又称二叉链表表示法,表中每个结点设有两个链域,分别指向该结点的中每个结点设有两个链域,分别指向该结点的第

6、一个孩子结点和下一个兄弟右兄弟结点。第一个孩子结点和下一个兄弟右兄弟结点。 fch data nsib第一孩子第一孩子 下一兄弟下一兄弟结点结构结点结构:孩子兄弟表示法的结点结构定义:孩子兄弟表示法的结点结构定义:typedef struct CSNode DataType data; Struct CSNode *FCh, *Nsib; CSNode, *CSTree; 孩子兄弟表示法示意图:孩子兄弟表示法示意图:ABCDEFGroot AB C E D F G优点:便于实现树的各种操作;优点:便于实现树的各种操作; 可实现树可实现树( (森林森林) )与二叉树的相互转换。与二叉树的相互转换

7、。ABCDEFGABCDEFG无兄弟无兄弟无右孩子无右孩子森林中兄弟树森林中兄弟树将转为右子树将转为右子树对应的关系:对应的关系: 树树 二叉树二叉树 根根 根根 第一孩子第一孩子 左孩子左孩子 下一兄弟下一兄弟 右孩子右孩子一、一、 树转换为二叉树树转换为二叉树 约定树中每一个结点的孩子结点按从左到约定树中每一个结点的孩子结点按从左到右的次序顺序编号,即把树看作为有序树。右的次序顺序编号,即把树看作为有序树。 6.4.2 6.4.2 树、森林与二叉树的相互转换树、森林与二叉树的相互转换将一棵树转换为二叉树的方法:将一棵树转换为二叉树的方法: 树中所有相邻兄弟之间加一条连线。树中所有相邻兄弟之

8、间加一条连线。 对树中的每个结点,只保留其与第一个对树中的每个结点,只保留其与第一个孩子结点之间的连线,删去其与其它孩子结孩子结点之间的连线,删去其与其它孩子结点之间的连线。点之间的连线。 以树的根结点为轴心,将整棵树顺时针以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。旋转一定的角度,使之结构层次分明。 树转换为二叉树示意图树转换为二叉树示意图ABECDFGHABECDFGHABECDFGHABECDFGH森林转换为二叉树的方法为:森林转换为二叉树的方法为:(1 1将森林中的每棵树转换成相应的二叉树。将森林中的每棵树转换成相应的二叉树。(2 2第一棵二叉树不动,从第二棵二

9、叉树开第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连棵二叉树根结点的右孩子,当所有二叉树连在一起后,所得到的二叉树就是由森林转换在一起后,所得到的二叉树就是由森林转换得到的二叉树。得到的二叉树。 二、森林转换为二叉树二、森林转换为二叉树森林转换为二叉树示意图森林转换为二叉树示意图 B E CH D I F J G B C D E F GH I J森林转换为二叉树的实例另见森林转换为二叉树的实例另见p179的图的图6.31递归方法描述森林转换为二叉树递归方法描述森林转换为二叉树: : 将森林将森

10、林F F看作树的有序集看作树的有序集F=T1F=T1,T2T2,,TN,TN,它对应的二叉树为它对应的二叉树为B BF F):): (1 1若若N N0 0,则,则B BF F为空。为空。 (2 2若若N0N0,那么:,那么: 二叉树二叉树B BF F的根为森林中第一棵树的根为森林中第一棵树T1T1的根;的根; B BF F的左子树为的左子树为B B(T11T11,T1mT1m),),其中其中T11T11,T1mT1m是是T1T1的子树森林;的子树森林; B BF F的右子树是的右子树是B B(T2T2,TNTN)。)。 二叉树转换为树或森林的方法为:二叉树转换为树或森林的方法为:(1 1若某

11、结点是其双亲的左孩子,则把该结若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子、点的右孩子、右孩子的右孩子、都与该都与该结点的双亲结点用线连起来。结点的双亲结点用线连起来。 (2 2删掉原二叉树中所有双亲结点与右孩子删掉原二叉树中所有双亲结点与右孩子结点的连线。结点的连线。 (3 3整理由整理由1 1)、()、(2 2两步所得到的树或两步所得到的树或森林,使之结构层次分明。森林,使之结构层次分明。 三、二叉树转换为树或森林三、二叉树转换为树或森林 二叉树转换为森林的示意图二叉树转换为森林的示意图DABCEFGHIJDABCEFGHIJHIJGDABCEF 若若B B是一棵二叉树,是

12、一棵二叉树,T T是是B B的根结点,的根结点,L L是是B B的的左子树,左子树,R R为为B B的右子树,设的右子树,设B B对应的森林对应的森林F FB B中含有的中含有的n n棵树为棵树为T1,T2, ,TnT1,T2, ,Tn,则有:,则有: (1 1B B为空,那么:为空,那么:F FB B为空的森林为空的森林n n0 0)。)。 (2 2B B非空,那么:非空,那么: F FB B中第一棵树中第一棵树T1T1的根为二叉树的根为二叉树B B的根的根T T; T1 T1中根结点的子树森林由中根结点的子树森林由B B的左子树的左子树L L转换而转换而成,即成,即F FL L)=T11,

13、T1m=T11,T1m; B B的右子树的右子树R R转换为转换为F FB B中其余树组成的森中其余树组成的森林,即林,即F(R)F(R) T2, T3, ,Tn T2, T3, ,Tn。 用递归的方法描述其转换用递归的方法描述其转换6.4.3 6.4.3 树与森林的遍历树与森林的遍历一、一、 树的遍历树的遍历树的遍历主要有以下两种:树的遍历主要有以下两种: 先根遍历先根遍历 后根遍历后根遍历1 1、先根遍历、先根遍历若树非空,则遍历过程为:若树非空,则遍历过程为:(1访问根结点。访问根结点。(2从左到右,依次先根遍历根结点的每一棵子树。从左到右,依次先根遍历根结点的每一棵子树。 ABECDF

14、GH如图中树的先根遍历序列为:如图中树的先根遍历序列为:ABECFHGD。若树非空,则遍历过程为:若树非空,则遍历过程为:(1 1从左到右,依次后根遍历根结点的每一从左到右,依次后根遍历根结点的每一棵子树。棵子树。(2 2访问根结点。访问根结点。ABECDFGH如图树的后根遍历序列为:如图树的后根遍历序列为: EBHFGCDA。2 2、后根遍历、后根遍历 A B E CH D I F J G A B C D E F GH I J树的后根遍历:树的后根遍历:H I J E B C F G D H I J E B C F G D A A树的先根遍历:树的先根遍历:A B E H I J C D F

15、 G对应二叉树的先序遍历对应二叉树的先序遍历 对应二叉树的中序遍历对应二叉树的中序遍历 二、树的遍历算法二、树的遍历算法 先根遍历方法一先根遍历方法一void RootFirst(CSTree root) if (root!=NULL) Visit(root -data); /* 访问根结点访问根结点 */ p= root- FCh; while (p!=NULL) RootFirst( p ); /* 访问以访问以p为根的子树为根的子树 */ p = p - Nsib; 先根遍历方法二先根遍历方法二 void RootFirst(CSTree root) if (root!=NULL) Vi

16、sit (root -data); /*访问根结点访问根结点*/ RootFirst (root-FCh); /*先根遍历首子树先根遍历首子树*/ RootFirst (root-Nsib); /*先根遍历兄弟树先根遍历兄弟树*/ 三、森林的遍历三、森林的遍历森林的遍历方法主要有以下三种:森林的遍历方法主要有以下三种:先序遍历先序遍历 中序遍历中序遍历 * *后序遍历后序遍历1 1、先序遍历、先序遍历若森林非空,则遍历方法为:若森林非空,则遍历方法为:(1 1访问森林中第一棵树的根结点。访问森林中第一棵树的根结点。(2 2先序遍历第一棵树的根结点的子树森林。先序遍历第一棵树的根结点的子树森林。

17、 (3 3先序遍历除去第一棵树之后剩余的树构成先序遍历除去第一棵树之后剩余的树构成的森林。的森林。 即:依次从左至右对森林中的每一棵树进即:依次从左至右对森林中的每一棵树进 行先根遍历。行先根遍历。若森林非空,则遍历方法为:若森林非空,则遍历方法为:(1 1中序遍历森林中第一棵树的根结点的中序遍历森林中第一棵树的根结点的 子树森林。子树森林。 (2 2访问第一棵树的根结点。访问第一棵树的根结点。 (3 3中序遍历除去第一棵树之后剩余的树中序遍历除去第一棵树之后剩余的树 构成的森林。构成的森林。 2 2、中序遍历、中序遍历即:依次从左至右对森林中的每一棵树进行即:依次从左至右对森林中的每一棵树进

18、行 后根遍历。后根遍历。 先序遍历森林时顶点先序遍历森林时顶点的访问次序:的访问次序:A B C D E F G H I J 中序遍历森林时顶点中序遍历森林时顶点的访问次序:的访问次序:B C D A F E I H J G A E GB C D F H J I AB E C F G D H I J 树和森林的遍历和二叉树遍历的对应关系树和森林的遍历和二叉树遍历的对应关系 ?先根遍历先根遍历后根遍历后根遍历树树二叉树二叉树森林森林先序遍历先序遍历先序遍历先序遍历中序遍历中序遍历中序遍历中序遍历3 3、森林的后序遍历、森林的后序遍历* *若森林非空,则遍历方法为:若森林非空,则遍历方法为:(1

19、1后序遍历森林中第一棵树的根结点的子后序遍历森林中第一棵树的根结点的子树森林。树森林。 (2 2后序遍历除去第一棵树之后剩余的树构后序遍历除去第一棵树之后剩余的树构成的森林。成的森林。 (3 3访问第一棵树的根结点。访问第一棵树的根结点。 6.5 6.5 哈夫曼树及其应用哈夫曼树及其应用6.5.1 6.5.1 哈夫曼树哈夫曼树 哈夫曼树最典型、最广泛的应用是在哈夫曼树最典型、最广泛的应用是在编码技术上,利用哈夫曼树,可以得到编码技术上,利用哈夫曼树,可以得到平均长度最短的编码。这在通讯领域是平均长度最短的编码。这在通讯领域是极其有价值的。极其有价值的。 计算机程序操作码的优化也可以利用计算机程

20、序操作码的优化也可以利用哈夫曼树实现。哈夫曼树实现。途径:从一个结点到另一个结点之间的分支途径:从一个结点到另一个结点之间的分支 序列。序列。路径长度:从一个结点到另一个结点所经过路径长度:从一个结点到另一个结点所经过 的分支条数。的分支条数。树的路径长度:树中每个结点与根之间的路径树的路径长度:树中每个结点与根之间的路径 长度之和长度之和PL)。)。a例:例:PL(a)=1+1+2+2+2+2=10 bPL(b)=1+1+2+2+3+3=12一、基本概念:一、基本概念:带权路径长度:在树形结构中,我们把从树根带权路径长度:在树形结构中,我们把从树根到某一结点的路径长度与该结点权的乘积,称到某

21、一结点的路径长度与该结点权的乘积,称做该结点的带权路径长度。做该结点的带权路径长度。树的带权路径长度:树中所有叶子结点的带权树的带权路径长度:树中所有叶子结点的带权路径长度之和,称为树的带权路径长度,通常路径长度之和,称为树的带权路径长度,通常记为记为WPL:WPL= wilii=1n其中:其中:n为叶子结点的个数;为叶子结点的个数;wi为第为第i个叶子的权个叶子的权值;值; li为第为第i个叶子结点的路径长度。个叶子结点的路径长度。结点的权:给树中每个结点赋予一个具有实际意结点的权:给树中每个结点赋予一个具有实际意义的数值,我们称该数值为这个结点的权。义的数值,我们称该数值为这个结点的权。例

22、如下图所示的三棵二叉树例如下图所示的三棵二叉树WPL(a)=7252224236其带权路径长度分别为:其带权路径长度分别为:2457a75 4b25 42c7WPL(b)=4273532146WPL(c)=7152234335 什么样的树的带权路径长度什么样的树的带权路径长度WPL最小?最小? 例如:给定一个权值序列例如:给定一个权值序列2, 4, 5, 7,可构造,可构造多种二叉树的形态多种二叉树的形态:问题问题2 2:2457a75 4b25 42c7 WPL(a) 36 WPL(b) 46 WPL(c)35 其带权路径长度分别为:其带权路径长度分别为: 在各种形态的含有在各种形态的含有

23、n个叶子结点的个叶子结点的 二二 叉树中叉树中, 必存在一棵必存在一棵(几棵几棵)其带权路径长度其带权路径长度值值WPL 最小的树,被称为最小的树,被称为“最优二叉树最优二叉树” 。 特征:在最优二叉树中没有度数为特征:在最优二叉树中没有度数为 1 的结的结点点(可用反证法证明可用反证法证明); 含含 n个叶子结点的最个叶子结点的最优二叉树的总结点数为优二叉树的总结点数为 2*n-1 (依据二叉树依据二叉树性质三性质三)。 最优二叉树的构造方法最早由哈夫曼最优二叉树的构造方法最早由哈夫曼研究,所以又称为研究,所以又称为“哈夫曼树哈夫曼树”。二、哈夫曼树的构造二、哈夫曼树的构造 (1) 根据给定

24、的根据给定的 n 个权值个权值 w1, w2, , wn ,构造构造 n 棵二叉树的集合棵二叉树的集合 F = T1, T2, , Tn, 其中每棵二叉树中均只含一个带权其中每棵二叉树中均只含一个带权值为值为 wi 的根结点,其左、右子树为空树;的根结点,其左、右子树为空树;构造哈夫曼树的方法:构造哈夫曼树的方法: 在在 F 中选取其根结点的权值为最小的两棵中选取其根结点的权值为最小的两棵二叉树二叉树, 分别作为左、右子树构造一棵新的二分别作为左、右子树构造一棵新的二叉树叉树, 并置这棵新的二叉树根结点的权值为其并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和;左、右子树根结点的权

25、值之和;(2)从从F中删去这两棵树中删去这两棵树,并加入刚生成的新树;并加入刚生成的新树; 反复反复 (2) 和和 (3) ,直至直至 F 中只含一棵树为止。中只含一棵树为止。(3)(4) 由此得到二叉树就是由此得到二叉树就是“最优二叉树最优二叉树” ” 即即“哈夫曼树哈夫曼树” ” 。 例如例如: : 已知权值已知权值 W= 5, 6, 2, 9, 7 W= 5, 6, 2, 9, 7 9562752769767139527构造哈夫曼树如下:构造哈夫曼树如下:952716671329三、哈夫曼算法的实现三、哈夫曼算法的实现 n个叶子结点的哈夫曼树共有个叶子结点的哈夫曼树共有2n-1个结点个结

26、点,因此可用有因此可用有2n-1个元素的数组来存储哈夫曼树个元素的数组来存储哈夫曼树, 结点间的关系用游标表示,即采用静态链表来结点间的关系用游标表示,即采用静态链表来存储哈夫曼树。存储哈夫曼树。 1、存储结构、存储结构 每个结点需包含其双亲结点信息和孩子结每个结点需包含其双亲结点信息和孩子结点信息,所以构成一个静态三叉链表。点信息,所以构成一个静态三叉链表。 weight parent Lchild weight parent Lchild RchildRchild 权值权值 双亲序号双亲序号 左孩子序号左孩子序号 右孩子序右孩子序号号 静态三叉链表结构定义静态三叉链表结构定义#define

27、 N 20#define M 2*N-1 typedef struct int weight ; int parent,Lchild,Rchild ; HTNode, HuffmanTreeM+1; /*0号单元不号单元不用用*/ 静态三叉链表数组中前静态三叉链表数组中前 n n 个元素存储叶子结点,个元素存储叶子结点,后后n-1n-1个元素存储分支结点即不断生成的新结点,个元素存储分支结点即不断生成的新结点,最后一个元素存储哈夫曼树的根结点。最后一个元素存储哈夫曼树的根结点。 2、哈夫曼算法、哈夫曼算法 初始化:先将初始化:先将n个元素都视为根结点,个元素都视为根结点,即孩子和双亲指针全置即

28、孩子和双亲指针全置0。 建哈夫曼树的过程是:反复在数组中建哈夫曼树的过程是:反复在数组中选双亲为选双亲为0(表示它们当前是树根表示它们当前是树根)且权值最且权值最小的两结点小的两结点, 将它们作为左右孩子挂在新将它们作为左右孩子挂在新的结点之下的结点之下, 新结点权值为左右孩子权值新结点权值为左右孩子权值之和。之和。 void CrtHuffmanTree(HuffmanTree ht , int w, int n) /* w存放已知的存放已知的n个权值,构造哈夫曼树个权值,构造哈夫曼树ht */ m=2*n-1; for(i=1;i=n;i+) hti=wi,0,0,0; for(i=n+1

29、;i=m;i+) hti=0,0,0,0;for(i=n+1;i=m;i+) select(ht,i-1,&s1,&s2); /*ht前前i-1项选双亲为零且权项选双亲为零且权最小的两结点最小的两结点*/ hts1.parent=i;hts2.parent=i; hti.Lchild=s1;ht i.Rchild=s2; ht i.weight=ht s1.weight+ht s2.weight; 例给定权值例给定权值: 9,14 ,10 ,10, 12, 13, 9 ,11 i wt par Lch Rch1 5 0 0 02 29 0 0 03 7 0 0 04 8 0 0

30、 05 14 0 0 06 23 0 0 07 3 0 0 08 11 0 0 09 0 0 0 010 0 0 0 011 0 0 0 012 0 0 0 013 0 0 0 014 0 0 0 015 0 0 0 08 0 1 79915 0 3 4101019 0 8 9111129 0 5 10121242 0 6 11131358 0 2 121414100 0 13 141515for(i=1;i=n;i+) hti=wi,0,0,0;for(i=n+1;i=m;i+) hti=0,0,0,0;for(i=n+1;i=m;i+) select(ht,i-1,&s1,&

31、;s2); hts1.parent=i; hts2.parent=i; hti.Lchild=s1; hti.Rchild=s2; hti.weight=hts1.weight +hts2.weight; 哈夫曼树最典型的应用是在编码,利用哈哈夫曼树最典型的应用是在编码,利用哈夫曼树,可以得到平均长度最短的编码。夫曼树,可以得到平均长度最短的编码。6.5.2 6.5.2 哈夫曼编码哈夫曼编码 平均长度最短的编码一般为不等长编码,平均长度最短的编码一般为不等长编码,为使各编码间无需加分界符即可识别,其编码为使各编码间无需加分界符即可识别,其编码应是前缀码。应是前缀码。前缀码:同一字符集中任何一个

32、字符的编码都前缀码:同一字符集中任何一个字符的编码都不是另一个字符编码的前缀最左子串)。不是另一个字符编码的前缀最左子串)。一、概念一、概念 利用哈夫曼树可以构造不等长的二进制编利用哈夫曼树可以构造不等长的二进制编码,并且构造所得的编码是一种最优前缀编码,码,并且构造所得的编码是一种最优前缀编码,即可以使所传信息的总长度最短。即可以使所传信息的总长度最短。二、哈夫曼编码二、哈夫曼编码: : 对哈夫曼树中每个左分支赋予对哈夫曼树中每个左分支赋予0 0,右分支,右分支赋予赋予1 1,则从根到每个叶子的路径上,各分支,则从根到每个叶子的路径上,各分支的值构成该叶子的哈夫曼编码。的值构成该叶子的哈夫曼

33、编码。例:若要传输如下单词例:若要传输如下单词 state, seat, act, tea, cat, set, a, eat如何使所传送的信息编码长度最短?如何使所传送的信息编码长度最短? 为保证信息编码长度最短,先统计各字为保证信息编码长度最短,先统计各字符出现的次数,然后以此作为权值符出现的次数,然后以此作为权值, , 构造哈构造哈夫曼树。夫曼树。723515851025000011110010010011编码编码:左分支左分支:0右分支右分支:1; 根到叶子路径上的根到叶子路径上的 值构成叶子的编码。值构成叶子的编码。11需传输信息:需传输信息:state, seat, act, te

34、a, cat, set, a, eat25783ceats各字符权值:各字符权值:010001011011ceats各字符编码:各字符编码: 构造哈夫曼树:构造哈夫曼树:结论一:哈夫曼编码是前缀码。结论一:哈夫曼编码是前缀码。结论二结论二: :哈夫曼编码是最优前缀码。哈夫曼编码是最优前缀码。 若若didj(didj(字符不同字符不同) ),则对应的树叶不同,则对应的树叶不同,因为从根到每个叶子的路径是不同的,所以一因为从根到每个叶子的路径是不同的,所以一条路径不可能是另一条路径的前部前缀),条路径不可能是另一条路径的前部前缀),因此哈夫曼编码是前缀码。因此哈夫曼编码是前缀码。 用字符出现的频率

35、用字符出现的频率(Pi)(Pi)为权值构造哈夫为权值构造哈夫曼树曼树, ,并以此来构造字符的哈夫曼编码,由于并以此来构造字符的哈夫曼编码,由于哈夫曼树的哈夫曼树的WPLWPL最小:最小:所以传输的报文长度:所以传输的报文长度: 必定最小。必定最小。 WPL= wilii=1n报文长报文长= Pilii=1n三、哈夫曼编码应用举例三、哈夫曼编码应用举例例:设有一台模型机,共有例:设有一台模型机,共有7 7种不同的指令,种不同的指令,各指令的使用频率各指令的使用频率PiPi为:为:指指 令令I1I2I3I4I5I6I7 使用频率使用频率pi0.400.300.150.050.040.030.03

36、哈夫曼树最典型、最广泛的应用是在编码哈夫曼树最典型、最广泛的应用是在编码技术上,而操作码的优化也是其应用之一。技术上,而操作码的优化也是其应用之一。 以指令的使用频率为权值构造哈夫曼树,以指令的使用频率为权值构造哈夫曼树,并求各指令的哈夫曼编码。并求各指令的哈夫曼编码。则指令的平均码长为:则指令的平均码长为:pili =0.4*7+0.3*2+0.15*3+0.05*5+0.04*5 +0.03*5+0.03*5 = 2.20ni=1若用等长编码,其平均码长为若用等长编码,其平均码长为3。 指令指令I1I2I3I4I5I6I7编码编码10100100011000100000100000各指令的

37、哈夫曼编码为:各指令的哈夫曼编码为: 四、哈夫曼编码算法四、哈夫曼编码算法 利用哈夫曼树求编码时,编码是由后利用哈夫曼树求编码时,编码是由后向前生成的,需要走一条从叶子到根的路向前生成的,需要走一条从叶子到根的路径:径: 当前结点若是其双亲的左子树时,当前结点若是其双亲的左子树时,则置当前编码位为则置当前编码位为0,否则置为,否则置为1。 当由叶子走到根结点时,完成一当由叶子走到根结点时,完成一个叶子结点编码的求取。个叶子结点编码的求取。 由哈夫曼树生成编码时由哈夫曼树生成编码时, 编码存储在多个字编码存储在多个字符数组中符数组中, 每个数组表示一个叶子结点的编码。每个数组表示一个叶子结点的编

38、码。存储定义:存储定义:typedef char * Huffmancoden+1;char * cd;int start;例:例: 0 4 5 6 7 8 start cd: 0 1 1 0 0 4 hc 1 0 1 1 0 0 2 1 0 0 3 1 1 1 0 0 4 1 1 1 1 0 5 1 1 0 0 6 0 0 0 7 0 1 1 1 0 8 0 1 0 0 CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n) /*从叶子到根,逆向求每个叶子对应的哈夫从叶子到根,逆向求每个叶子对应的哈夫曼编码曼编码*/ for(i=1;iLChild, b2-LChild); like2=like(b1-RChild, b2-RChild); return (like1 & like2); 1、二叉树相似性判定、二叉树相似性判定 2、层次遍历二叉树、层次遍历二叉树in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论