哈夫曼树的建立及应用
哈夫曼树的建立及应用C++作业+心得
哈夫曼树的建立及应用C++作业+心得第一篇:哈夫曼树的建立及应用 C++ 作业+ 心得专业:计算机科学与技术班级:计算机09-1姓名: ***学号: 20指导老师:陈**评分:实验四哈夫曼树的建立及应用一、实验目的1、2、3、1、掌握哈夫曼树的基本概念及所有的存储结构。
掌握哈夫曼树的建立算法。
掌握哈夫曼树的应用(哈夫曼编码和译码)。
给定权值5,29,7,8,14,23,3,11,建立哈夫曼树,输出哈夫曼编码。
二、实习内容2、对上述给定的哈夫曼树及得到的哈夫曼编码,试输入一串二进制编码,输出它的哈夫曼译码。
三、算法描述将建立哈夫曼树、实现哈夫曼编码、哈夫曼译码都定义成子函数的形式,然后在主函数中调用它们。
建立哈夫曼树时,将哈夫曼树的结构定义为一个结构型的一维数组,每个元素含有四项:权值,双亲,左孩子,右孩子。
给定的权值可以从键盘输入,要输出所建立的哈夫曼树,只要输出表示哈夫曼树的一维数组中的全部元素即可。
要实现哈夫曼编码,只要在所建立的哈夫曼树上进行二进制编码:往左走,编码为0,往右走,编码为1,然后将从根结点到树叶中的所有0、1排列起来,则得到该树叶的哈夫曼编码。
哈夫曼编码可以用一个结构型的一维数组保存,每个元素包含:编码、编码的开始位置、编码所对应的字符三项。
程序清单:#include #include const int n=8;const int m=2*n-1;struct tree {float weight;int parent;int lch,rch;};struct codetype {int bits[n+1];int start;char ch;};tree hftree[m+1];struct codetype code[n+1];void creathuffmantree(){int i,j,p1,p2;float s1,s2;for(i=1;i<=m;i++){hftree[i].parent=0;hftree[i].lch=0;hftree[i].rch=0;hftree[i].weight=0;} cout<<“输入”<cin>>hftree[i].weight;for(i=n+1;i<=m;i++){p1=p2=0;s1=s2=32767;for(j=1;j<=i-1;j++)if(hftree[j].parent==0)if(hftree[j].weight{s2=s1;s1=hftree[j].weight;p2=p1;p1=j;}elseif(hftree[j].weight{s2=hftree[j].weight;p2=j;}hftree[p1].parent=i;hftree[p2].parent=i;hftree[i].lch=p1;hftree[i].rch=p2;hftree[i].weight=hftree[p1].weight+hftree[p2].weight;}} void huffcode(){codetype cd;int c,p;for(int i=1;i<=n;i++){cd.start=n+1;cd.ch=96+i;c=i;p=hftree[i].parent;while(p!=0){cd.start--;if(hftree[p].lch==c)cd.bits[cd.start]=0;else cd.bits[cd.start]=1;c=p;p=hftree[p].parent;}code[i]=cd;} for(i=1;i<=n;i++){cout<<“字符”<为:”<for(int j=code[i].start;j<=n;j++)cout<cout<>b;while((b=='0')||(b=='1')){if(b=='0')i=hftree[i].lch;else i=hftree[i].rch;if(hftree[i].lch==0){cout<i=m;}cin>>b;}} void main(){creathuffmantree();huffcode();trancode();} 运行结果:结果分析(心得体会):上网找了相关的内容才完成了这次实验,但总的来说,对数据结构的知识认识不深,通过这次的实验,我学会了哈夫曼树的建立及应用,我更懂得要编程序,就要学习更多的东西才行。
哈夫曼树及其应用
第三节哈夫曼树及其应用1.哈夫曼树的定义在二叉树中,一个结点到另一个结点之间的分支构成这两个结点之间的路径。
这三棵二叉树的带权路径长度分别为:WPL1=10*2+11*2+3*3+6*3+7*3+9*3=117WPL2=3*1+6*2+7*3+9*4+10*5+11*5=177WPL3=9*1+7*2+6*3+3*4+10*5+11*5=158构造哈夫曼树的过程:(1)将给定的n个权值{w1,w2,...,wn}作为n个根结点的权值构造一个具有n棵二叉树的森林{T1,T2,...,Tn},其中每棵二叉树只有一个根结点;(2)在森林中选取两棵根结点权值最小的二叉树作为左右子树构造一棵新二叉树,新二叉树的根结点权值为这两棵树根的权值之和;(3)在森林中,将上面选择的这两棵根权值最小的二叉树从森林中删除,并将刚刚新构造的二叉树加入到森林中;(4)重复上面(2)和(3),直到森林中只有一棵二叉树为止。
这棵二叉树就是哈夫曼树。
假设有一组权值{5,29,7,8,14,23,3,11},下面我们将利用这组权值演示构造哈夫曼树的过程。
这就是以上述8个权值为叶子结点权值构成的哈夫曼树,它的带权的路径长度为:WPL=(23+29)*2+(11+14)*3+(3+5+7+8)*4=2712.判定树在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。
例如,编制一个程序,将百分制转换成五个等级输出。
大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来:if (socre<60) printf("bad");else if (socre<70) printf("pass");else if (score<80) printf("general");else if (score<90) printf("good");esle printf("very good");在实际应用中,往往各个分数段的分布并不是均匀的。
哈夫曼树的建立及操作
哈夫曼树的建立及操作哈夫曼树是一种用于数据压缩的树形数据结构,可以有效地压缩数据并减小存储空间。
本文将介绍哈夫曼树的建立方法和相关操作。
一、哈夫曼树的建立方法:1.首先,我们需要统计给定数据中每个字符出现的频率。
频率越高的字符将被赋予较短的编码,从而实现数据的压缩。
可以使用一个字典或哈希表来记录字符及其频率。
2.创建一个包含所有字符频率的节点列表。
每个节点包含一个字符及其对应的频率。
3.排序节点列表,按照频率从小到大的顺序进行排序。
4.创建一个空的二叉树,并将频率最低的两个节点作为子节点,合并为一个新的节点。
新节点的频率为两个子节点的频率之和。
将这个新节点插入到节点列表中。
5.从节点列表中移除原先的两个子节点,插入新节点。
保持列表的有序性。
6.重复步骤4和5,直到节点列表中只剩下一个节点。
7.最后剩下的节点即为哈夫曼树的根节点。
二、哈夫曼树的操作:1.获取哈夫曼编码:根据哈夫曼树的结构,可以通过遍历树的路径来获取每个字符的编码。
左子树表示0,右子树表示1、从根节点出发,依次遍历所有叶子节点,记录下每个字符对应的路径即可得到编码。
2.数据压缩:将原始数据中的每个字符替换为对应的哈夫曼编码,从而实现数据压缩。
根据频率,越常见的字符编码越短,可以大幅减小数据存储的空间。
3.数据解压:使用相同的哈夫曼树,将压缩后的二进制编码解码为原始字符,从而还原数据。
4. 哈夫曼树的存储和传输:为了实现数据的压缩和解压缩,哈夫曼树需要存储和传输。
可以使用二进制格式存储树的结构和频率信息,并在解压缩时重新构建树。
还可以考虑使用霍夫曼编码的变种,如Adaptive Huffman Coding(自适应哈夫曼编码),使得树结构可以随着数据的变化进行更高效的编码和解码。
总结:哈夫曼树是一种用于数据压缩的树形数据结构,可以通过统计字符频率来生成树,并生成对应的编码。
通过编码,可以实现原始数据的高效压缩和解压缩。
在实际应用中,哈夫曼树被广泛应用于数据压缩,如文件压缩、图像压缩等。
实验 哈夫曼树的建立
实验哈夫曼树的建立一、实验目的:1.理解哈夫曼树及其应用。
2.掌握生成哈夫曼树的算法。
二、实验内容:哈夫曼树,即最优树,是带权路径长度最短的树。
有着广泛的应用。
在解决某些判定问题上,及字符编码上,有着重要的价值。
构造一棵哈夫曼树,哈夫曼最早给出了算法,称为哈夫曼算法:(1)根据给定的N个权值W1,W2,W3,……,Wn ,构成N棵二叉树的集合F= T1,T2,T3,……,Tn ,其中每棵二叉树T1只有一个带权为WI的根结点,其左右子树均空。
(2)在F中选出两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的权值为其左右子树上的根结点的权值之和。
(3)在F中删除这两棵树,同时将新得到的加到F之中。
重复(2)和(3),直至F 中只剩一个为止。
三、程序流程图四、参考程序#include"stdio.h"#define LEN sizeof(struct HTnode)int i,l,n,w=0,c,start,a1,a2,f;struct HTnode {unsigned int weight;unsigned int parent,lchild,rchild;}*p,*HT;typedef char **Huffmancode;Huffmancode HC;char *cd;select(){int k=1,j,flag=0;while((HT+k)->parent!=0) k++;for(j=k+1;j<=n;j++,flag=0){if((HT+j)->parent!=0) flag=1;if((HT+j)->weight==0) flag=1;if(!flag) {if((HT+j)->weight<(HT+k)->weight) k=j;}}return(k);}main(){printf("\n赫夫曼树的建立:\n");printf("请输入权值(叶子)数目:");scanf("%d",&l);while(l<1) {printf("输入错误,请重新输入权值数目:"); scanf("%d",&l); }if(l==1) printf("\n只有一个权值,无须建立赫夫曼树!");else {n=2*l-1;HT=(struct HTnode*)malloc((n+1)*LEN);printf("请按对应顺序输入权值(输入一权值,键入一回车):\n");for(i=1,p=HT+1;i<=l;++i,++p){scanf("%d",&w);while(w<=0){printf("权值错,重新输入此权值:"); scanf("%d",&w);}p->weight=w; p->parent=0;p->lchild=0; p->rchild=0;}for(i=l+1;i<=n;++i,++p){p->weight=0; p->parent=0;p->lchild=0;}for(i=l+1;i<=n;++i){a1=select(); (HT+a1)->parent=i;a2=select(); (HT+a2)->parent=i;(HT+i)->lchild=a1;(HT+i)->rchild=a2;(HT+i)->weight=(HT+a1)->weight+(HT+a2)->weight;}HC=(Huffmancode)malloc((l+1)*sizeof(char *));cd=(char *)malloc(l*sizeof(char));*(cd+(l-1))='\0';for(i=1;i<=l;++i){start=l-1;for(c=i,f=(HT+i)->parent;f!=0;c=f,f=(HT+f)->parent)if((HT+f)->lchild==c) *(cd+(--start))='0';else *(cd+(--start))='1';*(HC+i)=(char *)malloc((l-start)*sizeof(char));strcpy(*(HC+i),(cd+start));}printf("\n对应的二进制赫夫曼编码为:\n");for(i=1;i<=l;++i){printf("%s",*(HC+i));printf(" ");}}}五、思考题目举一实例说明哈夫曼树的用途。
哈夫曼树的实际应用
哈夫曼树的实际应用
哈夫曼树(Huffman Tree)是一种重要的数据结构,它在信息编码和压缩、数据传输和存储、图像处理等领域有广泛应用。
1. 数据压缩:哈夫曼树是一种无损压缩的方法,能够有效地减小数据的存储空间。
在进行数据压缩时,可以使用哈夫曼树构建字符编码表,将出现频率较高的字符用较短的编码表示,而出现频率较低的字符用较长的编码表示,从而减小数据的存储空间。
2. 文件压缩:在文件压缩领域,哈夫曼树被广泛应用于压缩算法中。
通过构建哈夫曼树,可以根据字符出现的频率来生成不同长度的编码,从而减小文件的大小。
常见的文件压缩格式如ZIP、GZIP等都使用了哈夫曼树。
3. 图像压缩:在图像处理中,哈夫曼树被用于图像压缩算法中。
通过将图像中的像素值映射为不同长度的编码,可以减小图像的存储空间,提高图像传输和存储的效率。
常见的图像压缩格式如JPEG、PNG等都使用了哈夫曼树。
4. 文件传输:在数据传输中,哈夫曼树被用于数据压缩和传输。
通过对数据进行压缩,可以减小数据的传输时间和带宽占用。
在传输过程中,接收方可以通过哈夫曼树解码接收到的数据。
5. 数据加密:在数据加密中,哈夫曼树可以用于生成密钥,从而实现数据的加密和解密。
通过将字符映射为不同长度的编码,可以实
现对数据的加密和解密操作。
哈夫曼树在信息编码和压缩、数据传输和存储、图像处理等领域有广泛应用,能够有效地减小数据的存储空间、提高数据传输效率、实现数据加密等功能。
数据结构课程设计_哈夫曼树
数据结构课程设计_哈夫曼树哈夫曼树是数据结构课程设计中的一个重要内容,它是一种用于编码和压缩数据的树形结构。
在这篇文章中,我们将深入探讨哈夫曼树的原理、应用以及实现方法。
一、哈夫曼树的原理哈夫曼树是一种特殊的二叉树,它的构建依赖于哈夫曼编码的思想。
哈夫曼编码是一种变长编码方式,通过将频率较高的字符用较短的编码表示,而频率较低的字符用较长的编码表示,从而实现数据的高效压缩。
构建哈夫曼树的过程如下:1. 首先,将待编码的字符按照出现频率从小到大进行排序。
2. 然后,取出频率最小的两个字符,将它们作为叶子节点构建一个新的二叉树,该树的根节点的权值为这两个字符的频率之和。
3. 将新构建的二叉树插入到原有的字符列表中,并重新进行排序。
4. 重复步骤2和步骤3,直到只剩下一个根节点的二叉树为止,该树就是哈夫曼树。
二、哈夫曼树的应用哈夫曼树在数据压缩和编码中有着广泛的应用。
由于哈夫曼编码能够将频率较高的字符用较短的编码表示,从而减少了数据的存储空间,因此在文件压缩、图像压缩等领域被广泛应用。
在文件压缩中,哈夫曼树可以根据文件中字符的出现频率构建出一个最优的编码表,将文件中的字符替换为对应的哈夫曼编码,从而实现文件的高效压缩。
解压缩时,只需要根据哈夫曼编码表将编码还原为原始字符,即可恢复文件的原始内容。
在图像压缩中,哈夫曼树可以根据图像中像素值的出现频率构建出一个最优的编码表,将像素值替换为对应的哈夫曼编码,从而实现图像的高效压缩。
解压缩时,只需要根据哈夫曼编码表将编码还原为原始像素值,即可恢复图像的原始内容。
三、哈夫曼树的实现方法哈夫曼树的实现方法有多种,其中一种常见的方法是使用优先队列(也称为最小堆)来实现。
优先队列是一种特殊的队列,它的每个元素都有一个优先级,优先级高的元素先出队。
在构建哈夫曼树时,我们可以将字符和对应的频率作为优先队列中的元素,根据频率的大小来确定优先级。
每次从优先队列中取出两个频率最小的字符,将它们作为叶子节点构建一个新的二叉树,并将该二叉树的根节点插入到优先队列中。
哈夫曼树
F
K
11110
111111 110
F 24
0
Z 2
1
K 7
L
U
Z
100
111110
哈夫曼编码的效率。
我们定义该编码方案的平均编码长度为: B(T)=(c1p1+ c2p2 +…+ cnpn)/pt 其中: ci和pi是字符集中第i个字符的代码长度及 其相对频率,pt是字符集的总频率。对本例计算平 均编码长度≈2.565 若采用固定长度编码,每个字母需log28=3位, 而哈夫曼编码只需2.565位,节省空间约12%。 哈夫曼编码对于典型的文本文件将比ASCII编 码节省约40%的空间。
用途:用于通信和数据传送中字符的二进制编码,可以 使文件编码总长度最短。 例字符集: C D E F K L U Z 频 率:32 42 120 24 7 42 37 2
306
0
1 186
C D E
1110 101 0
E 79 0 1 120 0 U D 37 42
1 107 1 65 0 1 L 0 33 42 C 0 1 9
哈夫曼树及其应用
1.问题的提出
在程序设计中,常用一个代码来表示一个 元素,标准ASCII码就是一个例子。它用log2128 即7位提供了128个不同的代码来表示ASCII表中 的128个字符。假设所有代码都等长,则表示n 个不同的代码需要log2n位,称为固定长度编码 (如ASCII码)。如果每个字符的使用频率相等, 则固定长度编码的空间效率最高。但事实上,每 个字符的使用频率并非一样。
if (socre<60) printf(“bad”); else if (socre<70) printf(“pass”); else if (score<80) printf(“general”); else if (score<90) printf(“good”); esle printf(“very good”);
赫夫曼树的作用及应用
赫夫曼树的作用及应用1.引言在计算机科学中,赫夫曼树是一种重要的数据结构,它被广泛应用于数据压缩、存储和解码等领域。
赫夫曼树以其高效的特点,成为了压缩算法中的重要组成部分。
本文将介绍赫夫曼树的作用以及它在不同应用领域中的具体应用。
2.赫夫曼树的基本概念赫夫曼树,也称为最优二叉树,是一种树形结构。
它的构建基于赫夫曼编码算法,该算法通过将频率较高的字符编码为较短的二进制码,从而实现数据的高效压缩。
3.赫夫曼树的构建赫夫曼树的构建过程包括以下几个步骤:1.统计字符频率:遍历待压缩的数据,统计各个字符出现的频率。
2.构建叶子节点:将每个字符及其频率作为叶子节点,构成初始的二叉树。
3.合并节点:选择两个频率最低的节点合并,并将合并后的节点作为新的节点插入二叉树中。
4.重复合并:重复执行合并节点的操作,直到只剩下一个节点,即赫夫曼树的根节点。
4.赫夫曼树的作用赫夫曼树在数据压缩和解压缩中发挥着重要作用,主要体现在以下几个方面:4.1数据压缩赫夫曼树通过赫夫曼编码将频率较高的字符编码为较短的二进制码,从而实现数据的高效压缩。
压缩后的数据体积大大减小,方便存储和传输。
4.2文件压缩赫夫曼树可用于对文件进行压缩,将文件中的字符编码为对应的二进制码,从而减小文件的大小。
在文件传输和存储中,减小文件的大小可以提高传输速度和节省存储空间。
4.3图像压缩赫夫曼树也可用于图像数据的压缩,通过对图像中的像素进行编码,减小图像的大小。
图像压缩在图像处理和存储中起到重要的作用,减小图像的大小可以提高图像的传输速度和存储效率。
4.4视频压缩赫夫曼树在视频编码中也有重要应用,通过对视频帧中的数据进行编码,实现对视频的压缩。
视频压缩可以降低视频的带宽占用率,提高视频传输的效率和稳定性。
5.赫夫曼树的应用举例除了数据压缩方面,赫夫曼树在其他领域也有广泛应用,以下列举几个常见的应用场景:5.1字符串匹配赫夫曼树可以用于字符串匹配算法中,通过构建赫夫曼树和相关数据结构,提高字符串匹配的效率和准确性。
哈夫曼树构建策略概述
哈夫曼树构建策略概述哈夫曼树是一种用于数据压缩和编码的树形数据结构。
通过使用不同频率的字符编码成不同长度的比特串,哈夫曼树可以实现高效的数据压缩和解压缩过程。
本文将概述哈夫曼树的构建策略,帮助读者了解其原理和应用。
一、哈夫曼树的基本概念哈夫曼树是一种特殊的二叉树,它的每个节点都代表一个字符以及其出现的频率。
频率越高的字符越靠近树的根部。
利用这种结构,我们可以给出每个字符的唯一编码。
二、哈夫曼树的构建步骤1. 统计字符频率:首先,需要统计需要进行压缩的文本中每个字符的出现频率。
这些频率将决定哈夫曼树的构建过程。
2. 构建初始森林:将每个字符和其对应的频率作为树的叶子节点,构建初始森林。
这些独立的树将作为哈夫曼树构建的基础。
3. 构建哈夫曼树:从初始森林中选取频率最低的两颗树,将它们合并成一颗新的树,并将合并后的树返回到初始森林中。
重复这个步骤,直到初始森林中只有一颗树为止。
这颗树就是哈夫曼树。
4. 生成编码表:通过遍历哈夫曼树,从根部到每个叶子节点,可以得到每个字符的编码。
一般来说,左分支表示编码为0,右分支表示编码为1。
三、哈夫曼树的应用哈夫曼树主要应用于数据压缩和编码。
通过将频率较高的字符编码为较短的比特串,我们可以实现对数据的高度压缩,从而减少存储空间和传输带宽的需求。
此外,哈夫曼树也可以用于优先队列的实现。
在优先队列中,每个元素的优先级由其出现频率或权重决定。
通过使用哈夫曼树,我们可以高效地插入、删除和获取具有最高优先级的元素。
四、总结哈夫曼树是一种用于数据压缩和编码的重要数据结构。
通过统计字符频率、构建初始森林和合并树节点的方式,我们可以构建出一颗高效的哈夫曼树,并生成每个字符的唯一编码。
利用哈夫曼树,我们可以实现对数据的高效压缩和解压缩操作。
同时,哈夫曼树还可以应用于优先队列等其他领域。
总之,了解和掌握哈夫曼树的构建策略对于理解数据压缩和编码领域的算法和技术至关重要。
通过深入研究哈夫曼树,我们可以进一步提高数据压缩和编码的效率,并在实际应用中取得更好的性能。
哈夫曼树及其应用
53 78
29 29
42
14 15 23 19
7 8 11 8
53
42
58
23 19 29 29
11 8 14 15
53
78
100
42
58
23 19 29 29
11 8 14 15
53 78
▪ 哈夫曼树的应用 ❖ 最佳判定树
学生成绩的分布呈正态分布即:中等成绩的学生较多,而较 好或较差学生均比较少。设其分布规律如下表:
等级 不及格 及格 中等 良好 优秀
分数段 0~59 60~69 70~79 80~89 90~100 比例 5% 15% 40% 30% 10%
若采用图(a)来进行判断,则80%以上的数据要进行 三次或三次以上的比较才能得到结果。 而如果我们以各分数段人数的占总人数的比例5、15、 40、30、10为权值构造哈夫曼树,可得到(b)所示 的判定树来进行判断可以使大部分数据经过较少次数的 比较得到结果。
n
WPL WK LK k 1
c2 4d
a
b
7
5
WPL=7*3+5*3+2*1+4*2=46
a
bc
d
7
52
4
WPL=7*2+5*2+2*2+4
WPL=7*1+5*2+2*3+4*3=35
▪ 构造Huffman树的方法——Huffman算法
❖ 构造Huffman树步骤
• 根据给定的n个权值{w1,w2,……wn},构造n棵只有根 结点的二叉树,令起权值为wj
*hc=(HuffmanCode)malloc((n+1)*sizeof(char *)); cd=(char * )malloc(n * sizeof(char)); cd[n-1]=’\0’; for(i=1;i<=n;i++) { start=n-1;
哈夫曼树的构造和应用
《计算机软件技术基础》实验报告实验名称:实验三哈夫曼树的应用和实现实验目的:掌握哈夫曼树的基本构造,并能运用哈夫曼树实现前缀编码。
实验内容:完成下述功能:(1)根据输入的字符和相应的权重建立哈夫曼树,并输出已经建立的相应内容作为检查;(2)运用哈夫曼树实现前缀编码,并输出各字符的编码串;(3)输入一组二进制报文,进行译码,并输出译文。
实验要求:(1)数据元素为字符,其相应的权值为float;(2)对实验内容进行算法设计,将编制的程序输入计算机,编译运行;(3)程序的实际功能与上述所列功能不完全相符,调试程序,找出问题所在,并纠正。
(4)以教材中P162的例为数据,验证结果,并给出相应的说明。
实验原理:哈夫曼树的构造和应用(流程图)。
1,建立哈夫曼树,2,构建哈夫曼编码表,3,译码过程是编码的逆过程,算法流程图此处省略。
编译环境:PC中C++实验调试及分析处理:1,实验调试过程中出现以下错误:分析处理:程序运行出现上述错误,调试很久后发现,此问题主要是在调用译码函数时出错,原因是译码函数与主函数之间数据传递出现问题,修改后问题得到解决。
2,实验调试过程中出现以下错误:分析处理:程序运行出现上述错误,明显与书本上的例题运行结果不一致,程序也没发现什么大的错误,与同学讨论后发现原因,if(ht[j].parent==0&&m1>ht[j].weight){m2=m1;k2=k1;m1=ht[j].weight;k1=j;}elseif(ht[j].parent==0&&m2>ht[j].weight)这段程序应该改成if(ht[j].parent==0&&(m1-ht[j].weight)>=0.000001){m2=m1;k2=k1;m1=ht[j].weight;k1=j;}elseif(ht[j].parent==0&&(m2-ht[j].weight)>=0.000001)。
哈夫曼树和哈夫曼编码的原理和应用领域
哈夫曼树和哈夫曼编码的原理和应用领域哈夫曼树(Huffman Tree)和哈夫曼编码(Huffman Coding)是数据压缩领域中常用的算法。
哈夫曼编码通过对出现频率较高的字符使用较短的编码,对出现频率较低的字符使用较长的编码,从而实现对数据进行高效压缩。
本文将介绍哈夫曼树和哈夫曼编码的原理以及它们在通信和存储领域的应用。
一、哈夫曼树的原理哈夫曼树是一种特殊的二叉树,它的构建基于贪心算法。
首先,根据字符出现的频率构建一组叶子节点,每个叶子节点代表一个字符,并且带有该字符出现的频率。
接着,从这组叶子节点中选择出现频率最低的两个节点,将它们合并成一个新的节点,并将这个新节点的频率设置为两个节点频率之和。
新节点成为新的叶子节点,参与下一次的合并。
重复这个过程,直到最终只剩下一个节点,即为哈夫曼树的根节点。
二、哈夫曼编码的原理在哈夫曼树构建完成后,我们根据哈夫曼树的结构来为每个字符生成对应的编码。
对于每个字符,从根节点出发,向左子树走表示添加编码的0,向右子树走表示添加编码的1,直到到达叶子节点。
将每个字符的编码保存起来,就得到了哈夫曼编码。
由于哈夫曼树的构建过程保证了频率较高的字符拥有较短的编码,而频率较低的字符拥有较长的编码,所以哈夫曼编码具有前缀码的特性。
即任何一个字符的编码都不是其他字符编码的前缀,这样在进行解码的时候就不会出现歧义。
三、哈夫曼编码的应用领域1. 数据压缩:哈夫曼编码常被用于数据的无损压缩,通过将频率较高的字符用较短的编码表示,可以大大减小数据的存储空间。
2. 文件传输:在文件传输过程中,为了减小文件的大小,常常会使用哈夫曼编码对文件进行压缩,减少网络传输的时间和带宽占用。
3. 图像压缩:哈夫曼编码在图像压缩中也有广泛的应用。
通过对图像像素点进行编码,可以显著减小图像文件的体积,提高图像在传输和存储中的效率。
4. 视频压缩:在视频压缩中,哈夫曼编码被用于对视频帧中的运动矢量、亮度和色度信息进行编码,从而减小视频文件的大小。
哈夫曼树的建立及操作
实验六哈夫曼树的建立与操作一、实验要求和实验内容1、输入哈夫曼树叶子结点〔信息和权值〕2、由叶子结点生成哈夫曼树内部结点3、生成叶子结点的哈夫曼编码4、显示哈夫曼树结点顺序表二、实验要点:根据哈夫曼算法,建立哈夫曼树时,可以将哈夫曼树定义为一个构造型的一维数组HuffTree,保存哈夫曼树中各结点的信息,每个结点包括:权值、左孩子、右孩子、双亲,如图5-4所示。
由于哈夫曼树中共有2n-1个结点,并且进展n-1次合并操作,所以该数组的长度为2n-1。
构造哈夫曼树的伪代码如下:在哈夫曼树中,设左分支为0,右分支为1,从根结点出发,遍历整棵哈夫曼树,求得各个叶子结点所表示字符的哈夫曼编码。
三、.函数的功能说明及算法思路BTreeNode* CreateHuffman(ElemType a[],int n)//构造哈夫曼树1.对给定n个权值{a1,a2,…,an}的叶子结点,构成具有n棵二叉树的森林F={T1,T2,…,Tn}, 其中每棵二叉树Ti只有一个权值为ai的根结点,其左右子树为空。
2.在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
3.从F中删除构成新树的两棵树,并把新树参加到F中。
4.重复 2、3两步,直到F只有一棵树为止。
则F中的树就是哈夫曼树。
void PrintBTree(BTreeNode *BT)//以广义表形式输出哈夫曼树主要用到了递归的思想。
void HuffManCoding(BTreeNode *BT, int len)//求哈夫曼编码构造一棵二叉树,左分支标识为0,右分支标识为1,把 n 个字符看成是一棵树的 n个叶子结点,把从根结点到每个叶子结点路径上的分支标识序列作为字符的编码,则得到哈夫曼编码。
四、实验步骤和提示1、编写有关哈夫曼树操作的函数:①构造哈夫曼树 BTreeNode * CreateHuffman(ElemType a[],int n);②以广义表形式输出哈夫曼树 void PrintBTree(BTreeNode *BT);③求哈夫曼编码 void HuffManCoding(BTreeNode *BT, int len)。
数据结构课程设计 哈夫曼树
数据结构课程设计哈夫曼树数据结构课程设计 - 哈夫曼树一、引言哈夫曼树(Huffman Tree)是一种经典的数据结构,常被用于数据压缩和编码中。
它是一种特殊的二叉树,具有最优的前缀编码性质。
本文将详细介绍哈夫曼树的定义、构建方法以及应用场景。
二、哈夫曼树的定义哈夫曼树是一种满足以下条件的二叉树:1. 所有的叶子节点都带有权值;2. 没有度为1的节点;3. 任意两个叶子节点的路径长度不相同。
三、哈夫曼树的构建方法1. 构建哈夫曼树的基本思想是将权值较小的节点放在较低的层次,权值较大的节点放在较高的层次;2. 首先,根据给定的权值集合,将每一个权值看做一个独立的节点;3. 然后,选择两个权值最小的节点,将它们合并为一个新节点,并将新节点的权值设置为这两个节点的权值之和;4. 重复上述步骤,直到只剩下一个节点,即为哈夫曼树的根节点。
四、哈夫曼编码哈夫曼编码是一种变长编码方式,用于将字符转换为二进制编码。
它的特点是没有编码冗余,即每一个字符的编码都不是其他字符编码的前缀。
这种编码方式可以大幅度减小数据的存储空间和传输带宽。
五、哈夫曼树的应用场景1. 数据压缩:哈夫曼树可以根据字符浮现的频率构建最优的编码方式,从而实现数据的高效压缩;2. 文件压缩:将文件中的字符转换为哈夫曼编码,可以大幅度减小文件的大小;3. 图象压缩:将图象中的像素值转换为哈夫曼编码,可以实现图象的无损压缩;4. 视频压缩:将视频中的帧数据转换为哈夫曼编码,可以减小视频文件的大小。
六、哈夫曼树的时间复杂度和空间复杂度1. 构建哈夫曼树的时间复杂度为O(nlogn),其中n为权值的个数;2. 哈夫曼编码的时间复杂度为O(n),其中n为字符的个数;3. 哈夫曼树的空间复杂度为O(n),其中n为权值的个数。
七、总结哈夫曼树是一种重要的数据结构,具有广泛的应用场景。
通过构建最优的编码方式,可以实现高效的数据压缩和编码。
掌握哈夫曼树的定义、构建方法以及应用场景,对于数据结构课程的学习和实践具有重要意义。
哈夫曼树算法用途
哈夫曼树算法用途哈夫曼树是一种常用的数据压缩算法,广泛应用于文件压缩、图像压缩、音频压缩等领域。
它可以根据数据的频率分布构建一颗最优的二叉树,从而实现数据的高效压缩和解压缩。
下面将从哈夫曼树的原理、构建方法和应用领域等方面进行详细阐述。
首先,我们来了解一下哈夫曼树的原理。
哈夫曼树是一颗带权路径长度最短的二叉树,其带权路径长度是指所有叶子结点的权值乘以其到根结点的路径长度之和。
对于一组给定的权值集合,构建哈夫曼树的过程是这样的:首先将权值按照从小到大的顺序排序,然后取权值最小的两个结点作为叶子结点,构建一个新的父节点,其权值为两个叶子结点的权值之和。
将这个新的父节点插入到原来的集合中,重复上述步骤直到只剩下一个根结点为止。
最终构建出的二叉树就是一颗哈夫曼树。
接下来,我们来介绍一下哈夫曼树的构建方法。
构建哈夫曼树的核心思想是贪心算法,即每次都选择权值最小的两个结点进行合并。
具体的构建步骤如下:1. 将待构建哈夫曼树的结点按照权值从小到大排序。
2. 创建一个空的哈夫曼树,将权值最小的两个结点作为叶子结点插入到树中,并创建一个新的父节点,其权值为这两个结点的权值之和。
3. 将这个新的父节点插入到原来的结点集合中,并将原来的两个结点从集合中删除。
4. 重复上述步骤,直到只剩下一个根结点为止,构建出的二叉树就是一颗哈夫曼树。
构建哈夫曼树的时间复杂度为O(nlogn),其中n为叶子结点的个数。
由于每次都需要排序,所以效率较低。
为了提高效率,可以使用最小堆这种数据结构来快速选择权值最小的结点。
哈夫曼树的应用领域非常广泛。
其中最为重要的应用之一就是数据压缩。
在计算机存储和传输过程中,数据通常需要经过压缩以减小存储空间和传输带宽。
哈夫曼树作为一种高效的数据压缩算法,可以根据数据的频率分布来构建一个最优的编码表,将频率高的字符用较短的编码表示,而将频率低的字符用较长的编码表示,从而实现数据的高效压缩。
在文件压缩中,哈夫曼树可以根据不同字符的出现频率来构建一个相对最优的编码表,然后将文件中的字符按照这个编码表进行替换。
哈夫曼树hufferman构成原理应用及其数学证明
哈夫曼树hufferman构成原理应用及其数学证明哈夫曼树(Huffman Tree),又称最优树,它是一种常用的编码技术,它是一种十分高效的字符编码技术, 它主要是通过对字符按照出现频率高低进行分组,从而构成一颗树;每个字符的编码由树的层次顺序确定,字符越靠近根节点,编码越短,且编码长度与概率成正比,最后得出最优(最短)编码。
哈夫曼树构成原理:哈夫曼树构成原理是通过将信源字符重新按照概率顺序构成一棵有序树来实现的,即带有权值的叶子节点的树。
例如,某信源由四种字符A,B,C,D组成,出现的概率分别为p1,p2,p3,p4。
则可以构成一棵哈夫曼树。
首先,将四个字符依据概率从大到小重新排列,得到ABCD,依据概率大小选择A和B两个字符,以他们为叶子节点构成根节点,这样就分出了两颗子树。
接着将C和D两个字符以此作为叶子节点构成另外两棵子树,将他们与上面的根节点联接在一起,当初始树建立完毕,就得到了一棵哈夫曼树。
哈夫曼树数学证明:证明哈夫曼树是最优树:假设一棵信源树的叶子节点有n个,则此树的权重之和为:w1+w2+…+wn,其中wi是叶子节点i的权重,建立该信源树的目标是将其权重之和最小化,而在没有违反信源编码原理的前提下,树的最小权重之和也就是最优树的权重之和。
假设w1~wn分别为叶子节点1~n的权重,从大到小排列为w1,w2,…,wn,一棵以w1,w2,…,wn为叶子节点的最优树的权重之和为:T(w1,w2,…,wn)=w1+w2+…+wn+2(w1+w2)+2(w1+w2+w3)+……+2(w1+w2+…+wn-1)=2(w1+w2+…+wn-1)+wn =2T(w1,w2,…,wn-1)+wn由上式可知,最优树的权重之和T(w1,w2,…,wn)是由T (w1,w2,…,wn-1)和wn组成的,也就是说,每次取出w1,w2,…,wn中的最大者wn作为树的一个节点,其余的作为树的另一个节点,而每一次节点的选取都是满足最优化条件的,因此一棵满足最优树条件的树就是哈夫曼树,而此树的权重之和也就是最优树的权重之和.从上述可以看出,哈夫曼树构成原理和哈夫曼树数学证明都支持哈夫曼树是最优树的观点,因此哈夫曼树是一种有效的编码技术。
数据结构课程设计_哈夫曼树
数据结构课程设计_哈夫曼树一、引言哈夫曼树是一种重要的数据结构,广泛应用于编码和解码过程中。
本文将详细介绍哈夫曼树的概念、构建方法以及相关算法。
二、概述哈夫曼树,又称最优二叉树,是一种用于编码的树形结构。
它的特点是:权值越大的节点离根节点越近,权值越小的节点离根节点越远。
通过构建哈夫曼树,可以实现高效的编码和解码过程。
三、构建哈夫曼树的步骤1. 统计字符出现频率:对于给定的文本,首先需要统计每个字符出现的频率。
可以通过遍历文本,使用哈希表或数组记录每个字符出现的次数。
2. 构建哈夫曼树的节点:根据字符频率,创建对应的哈夫曼树节点。
每个节点包含字符和对应的频率。
3. 构建哈夫曼树:通过以下步骤构建哈夫曼树:a. 将所有节点按照频率从小到大排序。
b. 取出频率最小的两个节点作为左右子节点,生成一个新的父节点,父节点的频率为左右子节点频率之和。
c. 将新生成的父节点插入到节点集合中,并移除原来的两个子节点。
d. 重复步骤a-c,直到只剩下一个节点,即为哈夫曼树的根节点。
4. 哈夫曼编码:通过遍历哈夫曼树的路径,给每个字符生成对应的编码。
左子树路径标记为0,右子树路径标记为1。
将所有字符的编码存储在编码表中。
5. 哈夫曼解码:根据编码表和编码后的文本,通过遍历哈夫曼树,将编码转换为原始文本。
四、示例假设有一段文本:"Hello, World!",统计字符频率如下:H: 1e: 1l: 3o: 2,: 1(space): 1W: 1r: 1d: 1!: 1按照步骤三构建哈夫曼树:1. 创建节点集合:[H:1, e:1, l:3, o:2, ,:1, W:1, r:1, d:1, !:1]2. 构建哈夫曼树:a. 排序节点集合:[,:1, W:1, r:1, d:1, !:1, H:1, e:1, o:2, l:3]b. 取出频率最小的两个节点:[, W]c. 生成新的父节点:[:2]d. 插入父节点,并移除子节点:[:2, r:1, d:1]e. 重复上述步骤,直到只剩下一个节点:[:2, r:1, d:1, !:1, H:1, e:1, o:2, l:3]f. 最终得到哈夫曼树的根节点:[:10]根据哈夫曼树生成的编码表如下:H: 000e: 001l: 01o: 10,: 110(space): 1110W: 1111r: 1100d: 1101!: 11100编码后的文本为:"00101 1111 01 10 110 1110 1111 1100 1101 11100"。
哈夫曼编码树的构建和应用解析
哈夫曼编码树的构建和应用解析哈夫曼编码树(Huffman coding tree)是一种基于最优编码原理的数据压缩算法,通过构建一棵特殊的二叉树,将出现频率较高的字符用较短的编码表示,从而实现对数据的高效压缩。
本文将就哈夫曼编码树的构建和应用进行详细解析。
一、哈夫曼编码树的构建1. 频率统计:首先,需要统计待压缩的数据中各个字符的出现频率。
这可以通过遍历一次数据并记录每个字符的出现次数来实现。
2. 构建哈夫曼树:接下来,根据字符的出现频率构建哈夫曼树。
构建哈夫曼树的算法步骤如下:(1) 创建一个节点集合,将每个字符及其频率作为一个独立的节点插入集合中。
(2) 从集合中选择频率最小的两个节点,作为左右子节点创建一个新的节点。
(3) 将新节点插入集合中,并删除原先选择的两个节点。
(4) 重复上述步骤,直到集合中只剩下一个节点,即哈夫曼树的根节点。
3. 生成编码表:根据构建好的哈夫曼树,可以生成字符的编码表。
编码表是一个以字符为键,对应编码序列为值的映射表。
生成编码表的方法是:从根节点开始,向左走记为0,向右走记为1,直到叶子节点,记录下路径即为该叶子节点对应字符的编码。
二、哈夫曼编码树的应用解析哈夫曼编码树的主要应用在数据压缩领域,能够将数据以更高效的方式进行存储和传输。
以下是一些常见的哈夫曼编码树的应用场景:1. 文件压缩:对于文本文件等包含大量字符的数据,使用哈夫曼编码进行压缩可以大幅减少文件的大小。
由于哈夫曼编码树将频率较高的字符用较短的编码表示,所以可以实现较高的压缩比例。
2. 图像压缩:在数字图像处理中,可以使用哈夫曼编码对图像的像素值进行压缩。
将图像的像素值和其对应的出现频率作为字符和频率,构建哈夫曼编码树后,可以将图像的信息以更紧凑的方式表示,从而减少存储空间和传输带宽的使用。
3. 视频压缩:类似于图像压缩,哈夫曼编码树也可以应用于视频压缩中。
通过对视频帧的像素值进行编码,并借助哈夫曼编码树,可以实现对视频数据的高效压缩,从而减少视频文件的大小和网络传输的负荷。
哈夫曼Huffman树及应用
8 11 11 0 0
9 8 11 1 7
10 15 12 3 4
哈夫曼树
11 19 13 8 9 12 29 14 5 10
哈夫曼树对应的静态三叉链表13 58 15 6 11
14 100 0 13 14
w,p,lch,rch 是 weight,parent, lchild,rchild
的缩写
哈夫曼算法
如何得到使二进制 串总长最短编码
应用中每个字符的使用频率是不一样的。显然,为使传输 的二进制串尽可能的短,使用频率高的字符用较短编码,使用 频率低的字符用较长编码,电文总长= 原文中字符总数(字符x 使用频率 字符x编码长度)
为设计电文总长最短编码,可通过构造以字符使用频率作 为权值的哈夫曼树实现。
例 某通讯系统只使用8种字符a、b、c、d、e、f、g、h,其使用频率分别为 0.05,0.29,0.07,0.08, 0.14,0.23, 0.03,0.11。构造以字符使用频率作为权值的哈夫曼 树。,将权值取为整数w=(5,29,7,8,14,23,3,11),按哈夫曼算法构造的一棵哈夫曼 树如下:
Y
a<70 N C
a<80
N a<90 Y
N
B
A
4 哈夫曼编码
哈夫曼树除了能求解最优判定问题解,还用于其他一些最优问题的
求解。这里介绍用哈夫曼树求解数据的二进制编码。
在进行数据通讯时,涉及数据编码问题。所谓数据编码就是数据与
二进制字符串的转换。例如:邮局发电报,发送方将原文转换成二进制
字符串,接收方将二进制字符串还原成原文。
1)构造以 a、b、c、d、e、f、g、h为叶子结点的二叉树; 2)将该二叉树所有左分枝标记 0,所有右分枝标记1;
数据结构实验赫夫曼树的建立和应用
数据结构实验赫夫曼树的建立和应用概述赫夫曼树(Huffman Tree),又称最优二叉树(Optimal Binary Tree),是一种特殊的二叉树,常用于数据压缩算法中。
赫夫曼树的主要特点是,树中距离根节点较近的叶子节点的权值较小,距离根节点较远的叶子节点的权值较大。
本文将介绍赫夫曼树的建立过程和一些应用场景。
赫夫曼树的建立赫夫曼树的建立过程主要包含以下几个步骤:1.统计待编码的字符出现的频率,得到频率表。
2.将频率表中的字符和频率作为叶子节点,构成一个森林。
3.每次从森林中选择两个权值最小的节点(可以是叶子节点也可以是非叶子节点),合并为一个新的节点,并将该节点重新插入森林中。
4.重复上述步骤,直到森林中只剩下一个根节点,即为赫夫曼树的根节点。
下面是一个示例:字符频率A6B3C4D2E5根据以上频率表,我们可以构建下面的赫夫曼树: 20/ \\10 10/ \\ / \\5 5 4 6/ \\2 3赫夫曼编码赫夫曼编码是一种前缀编码的方式,即没有任何编码是其他编码的前缀。
赫夫曼编码通过将赫夫曼树中经过的路径用0或1进行编码,实现对字符的压缩。
在上面的例子中,赫夫曼编码如下:字符编码A10B110C111D00E01可以看到,编码表中每个字符的编码都是其他字符的前缀,符合赫夫曼编码的要求。
赫夫曼树的应用赫夫曼树在数据压缩领域有广泛的应用,常用于压缩文本文件。
通过统计字符出现的频率,并建立赫夫曼树和编码表,可以将原始文本中的字符用更短的二进制位来表示,从而达到压缩数据的目的。
除了数据压缩,赫夫曼树还可以应用于其他领域,例如网络数据传输中的数据压缩、图像编码等。
总结赫夫曼树是一种特殊的二叉树,通过统计字符出现的频率,建立赫夫曼树,并生成对应的赫夫曼编码表,可以实现对数据的压缩。
赫夫曼树在数据压缩领域有广泛的应用,可以大幅度减小数据存储和传输的开销。
需要注意的是,在使用赫夫曼树进行数据压缩时,对于频率较低的字符可能会出现编码较长的情况,这可能会导致压缩效果不佳。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
专业:
班级:
姓名:
学号:
指导老师:
评分:
实验四哈夫曼树的建立及应用
一、实验目的
1、掌握哈夫曼树的基本概念及所有的存储结构。
2、掌握哈夫曼树的建立算法。
3、掌握哈夫曼树的应用(哈夫曼编码和译码)。
二、实习内容
1、给定权值5,29,7,8,14,23,3,11,建立哈夫
曼树,输出哈夫曼编码。
2、对上述给定的哈夫曼树及得到的哈夫曼编码,试输入一
串二
进制编码,输出它的哈夫曼译码。
三、算法描述
将建立哈夫曼树、实现哈夫曼编码、哈夫曼译码都定义成子函数的形式,然后在主函数中调用它们。
建立哈夫曼树时,将哈夫曼树的结构定义为一个结构型的一维数组,每个元素含有四项:权值,双亲,左孩子,右孩子。
给定的权值可以从键盘输入,要输出所建立的哈夫曼树,只要输出表示哈夫曼树的一维数组中的全部元素即可。
要实现哈夫曼编码,只要在所建立的哈夫曼树上进行二进制编码:往左走,编码为0,往右走,编码为1,然后将从根结点到树叶中的所有0、1排列起来,则得到该树叶的哈夫曼编码。
哈夫曼编码可以用一个结构型的一维数组保存,每个元素包含:编码、编码的开始位置、编码所对应的字符三项。
四、程序清单:
#include<iostream>
#include<string>
using namespace std;
int x1,x2,s,mm;
int ww[100];
struct element
{
int weight,lchild,rchild,parent;
string bianma;
};
element huffTree[100];
int huff[100];//存储100个权值的数组
void Select(element huffTree[],int m)
{
int min,min2,i;
min=min2=1000;
for(i=0;i<m;i++)
if(huffTree[i].parent==-1)
if(min>huffTree[i].weight )
{
min2=min;
min=huffTree[i].weight ;
x2=x1;
x1=i;
}
else if(min2>huffTree[i].weight )
{
min2=huffTree[i].weight ;
x2=i;
}
}
//哈夫曼树函数
void HuffmanTree(element huffTree[])
{
int i;
cout<<"请设置叶子节点的数量: ";
cin>>s;
cout<<"请依次输入这"<<s<<"个叶子节点的权值(以回车或者空格为结束输入一个叶子节点的权值): "<<endl;
for(i=0;i<s;i++)
cin>>huff[i];
for(i=0;i<2*s-1;i++)
{
huffTree[i].parent =-1;
huffTree[i].lchild =-1;
huffTree[i].rchild =-1;
}
for(int i1=0;i1<s;i1++)
huffTree[i1].weight=huff[i1];
for(int k=s;k<2*s-1;k++)
{
Select(huffTree,k);
huffTree[x1].parent =k;
huffTree[x2].parent =k;
huffTree[k].weight =huffTree[x1].weight +huffTree[x2].weight ;
huffTree[k].lchild =x1;
huffTree[k].rchild =x2;
}
}
void HuffmanBianMa(element huffTree[],int n)
{
int i,j=0;
for(i=2*(n-1);i>n-1;i--)
{
huffTree[huffTree[i].lchild ].bianma ="0";
huffTree[huffTree[i].rchild ].bianma ="1";
}
for(i=0,j=0;j<n;j++)
{
while(huffTree[i].parent !=-1)
{
huffTree[j].bianma
=huffTree[huffTree[i].parent].bianma +huffTree[j].bianma ;
i=huffTree[i].parent ;
}
i=j+1;
}
for(i=0;i<n;i++)
cout<<endl<<"叶子节点的权值为: "<<huffTree[i].weight <<" 的编码为: "<<huffTree[i].bianma <<" ";
}
void HuffmanJieMa(element huffTree[],int n)
{
cout<<endl<<"请输入解码串的长度: ";
cin>>mm;
cout<<"请输入依次输入解码串(以回车或者空格为结束输入一个字符): "<<endl;
for(int i1=0;i1<mm;i1++)
cin>>ww[i1];
int j=n,j1;
int i=0;
while(huffTree[j].lchild !=-1&&i<mm)
{
if(ww[i]==1) j=huffTree[j].rchild ;
else j=huffTree[j].lchild ;
i++;
if(huffTree[j].lchild ==-1)
{
cout<<huffTree[j].weight <<endl;
j1=j;
j=n;
}
else j1=j;
}
if(huffTree[j1].lchild !=-1) cout<<"部分信息丢失,输入错误,解码失败!"<<endl;
}
void main()
{
HuffmanTree(huffTree);
HuffmanBianMa(huffTree,s);
HuffmanJieMa(huffTree,2*(s-1));
system("pause");
}
解码成功:
解码失败:
心得体会:这次实验主要是让我们掌握哈夫曼树的建立算法和掌握哈夫曼树的应用。