2021年哈夫曼树实验报告

合集下载

哈夫曼树_实验报告

哈夫曼树_实验报告

一、实验目的1. 理解哈夫曼树的概念及其在数据结构中的应用。

2. 掌握哈夫曼树的构建方法。

3. 学习哈夫曼编码的原理及其在数据压缩中的应用。

4. 提高编程能力,实现哈夫曼树和哈夫曼编码的相关功能。

二、实验原理哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树,又称为最优二叉树。

其构建方法如下:1. 将所有待编码的字符按照其出现的频率排序,频率低的排在前面。

2. 选择两个频率最低的字符,构造一棵新的二叉树,这两个字符分别作为左右子节点。

3. 计算新二叉树的频率,将新二叉树插入到排序后的字符列表中。

4. 重复步骤2和3,直到只剩下一个节点,这个节点即为哈夫曼树的根节点。

哈夫曼编码是一种基于哈夫曼树的编码方法,其原理如下:1. 从哈夫曼树的根节点开始,向左子树走表示0,向右子树走表示1。

2. 每个叶子节点对应一个字符,记录从根节点到叶子节点的路径,即为该字符的哈夫曼编码。

三、实验内容1. 实现哈夫曼树的构建。

2. 实现哈夫曼编码和译码功能。

3. 测试实验结果。

四、实验步骤1. 创建一个字符数组,包含待编码的字符。

2. 创建一个数组,用于存储每个字符的频率。

3. 对字符和频率进行排序。

4. 构建哈夫曼树,根据排序后的字符和频率,按照哈夫曼树的构建方法,将字符和频率插入到哈夫曼树中。

5. 实现哈夫曼编码功能,遍历哈夫曼树,记录从根节点到叶子节点的路径,即为每个字符的哈夫曼编码。

6. 实现哈夫曼译码功能,根据哈夫曼编码,从根节点开始,按照0和1的路径,找到对应的叶子节点,即为解码后的字符。

7. 测试实验结果,验证哈夫曼编码和译码的正确性。

五、实验结果与分析1. 构建哈夫曼树根据实验数据,构建的哈夫曼树如下:```A/ \B C/ \ / \D E F G```其中,A、B、C、D、E、F、G分别代表待编码的字符。

2. 哈夫曼编码根据哈夫曼树,得到以下字符的哈夫曼编码:- A: 00- B: 01- C: 10- D: 11- E: 100- F: 101- G: 1103. 哈夫曼译码根据哈夫曼编码,对以下编码进行译码:- 00101110111译码结果为:BACGACG4. 实验结果分析通过实验,验证了哈夫曼树和哈夫曼编码的正确性。

(完整word版)哈夫曼树实验报告

(完整word版)哈夫曼树实验报告

实验报告1、实验目的:(1)理解哈夫曼树的含义和性质。

(2)掌握哈夫曼树的存储结构以及描述方法。

(3)掌握哈夫曼树的生成方法。

(4)掌握哈夫曼编码的一般方法,并理解其在数据通讯中的应用.2、实验内容:哈夫曼树与哈弗曼编码、译码a。

问题描述:哈夫曼问题的提出可以参考教材P。

145。

利用哈弗曼编码进行通信可以大大提高通信利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码.b。

算法提示:参见教材P.147—148算法6.12、6。

13的描述.3、实验要求:建立哈夫曼树,实现编码,译码。

错误!.初始化(Initialization)。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。

○2。

编码(Encoding).利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran 中的正文进行编码,然后将结果存入文件CodeFile中。

○3.译码(Decoding ).利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件T extFile 中。

错误!.输出代码文件(Print).将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrint中。

错误!。

输出哈夫曼树(TreePrinting).将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

测试数据:设权值c= (a,b, c, d , e, f,g,h)w=(5,29,7,8,14,23,3,11),n=8。

按照字符‘0’或‘1’确定找左孩子或右孩子,则权值对应的编码为:5:0001,29:11,7:1110,8:111114:110,23:01,3:0000,11:001。

2021年哈夫曼编码解码实验报告

2021年哈夫曼编码解码实验报告

哈夫曼编码解码试验1.试验要求掌握二叉树相关概念掌握结构哈夫曼树, 进行哈夫曼编码。

对编码内容经过哈夫曼树进行解码。

2.试验内容经过二叉树结构哈夫曼树, 并用哈夫曼树对读取txt文件进行哈夫曼编码。

编码完成后经过哈夫曼树进行解码。

#include<stdio.h>#include<string.h>#define MAX 100//定义哈夫曼树存放结构typedef struct{char data;int weight;int parent;int lch;int rch;}HuffNode;//定义哈夫曼编码存放结构typedef struct{char bit[MAX];int start;}HuffCode;HuffNode ht[2*MAX];HuffCode hcd[MAX];int Coun[127]={0};int n;char s1[00];char text[5000];//结构哈夫曼树void HuffmanTree(){int i,j,k,left,right,min1,min2;//printf("输入叶子节点数: ");//scanf("%d",&n);printf("字符数量=%d\n",n);for(i=1;i<=2*n-1;i++){ht[i].parent=ht[i].lch=ht[i].rch=0;j=0;for(i=1;i<=n;i++){/*getchar();printf("输入第%d个叶子节点值: ",i);scanf("%c",&ht[i].data);printf("输入该节点权值: ");scanf("%d",&ht[i].weight);*/for(;j<127;j++){if(Coun[j]!=0){ht[i].data=j;//printf("%c",ht[i].data);ht[i].weight=Coun[j];//printf("%d",ht[i].weight);break;}}j++;}printf("\n");for(i=1;i<=n;i++)printf("%c",ht[i].data);}printf("\n");for(i=n+1;i<=2*n-1;i++){//在前n个结点中选择权值最小两个结点组成一颗二叉树min1=min2=10000;//为min1和min2设置一个比全部权值都大值left=right=0;for(k=1;k<=i-1;k++){if(ht[k].parent==0)//若是根结点//令min1和min2为最小两个权值, left和right 为权值最小两个结点位置if(ht[k].weight<min1){min2=min1;right=left;min1=ht[k].weight;left=k;}else if (ht[k].weight<min2){min2=ht[k].weight;right=k;}}ht[left].parent=i;ht[right].parent=i;ht[i].weight=ht[left].weight+ht[right].weight;ht[i].lch=left;ht[i].rch =right;}}//结构哈夫曼编码void HuffmanCode(){int i,c,k,f;HuffCode cd;for(i=1;i<=n;i++){cd.start=n;c=i;f=ht[i].parent;while(f!=0){if(ht[f].lch==c)cd.bit[cd.start]='0';elsecd.bit[cd.start]='1';cd.start--;c=f;f=ht[f].parent;}hcd[i]=cd;}printf("输出哈夫曼编码: \n");for(i=1;i<=n;i++){printf("%c:",ht[i].data);for(k=hcd[i].start+1;k<=n;k++)printf("%c",hcd[i].bit[k]);printf("\n");}}//对字母进行编码void Code()//将字符与对应哈夫曼编码进行匹配, 输出编码结果{int i=0,j,k,h=0;while(text[i]!='\0')for(j=1;j<=n;j++){if(text[i]==ht[j].data){for(k=hcd[j].start+1;k<=n;k++){s1[h]=hcd[j].bit[k];h++;}break;}}i++;}//printf("编码\n");//puts(s1);//printf("\n");}void HuffmanDecode(){printf("解码\n");int len,i,f;char C;//char S[MAXCODE];//scanf("%s",S);//使用gets()直接跳过len=strlen(s1);printf("s1:%d\n",len);f=2*n-1;for(i=0;i<len;i++){if(s1[i]=='0'){f=ht[f].lch;if(ht[f].lch==0&&ht[f].rch==0){C=ht[f].data;printf("%c",C);f=2*n-1;}}else if(s1[i]=='1'){f=ht[f].rch;if(ht[f].lch==0&&ht[f].rch==0){C=ht[f].data;printf("%c",C);f=2*n-1;}}}printf("\n");}//统计字母个数及其权值void Count(){int i,j,m;n=0;i=0;//printf("请仅输入小写字母\n");//例程本省存在一个BUG, 只输入一个字母不能进行编码(并未处理)//scanf("%s",s);while(text[i]!='\0')//使用ASCII码表进行统计{m=text[i];//printf("%d\n",m);Coun[m]++;i++;}for(j=0;j<127;j++){if(Coun[j]!=0)n++;}}//mark Codevoid main(){int l=0;FILE *fp;fp=fopen("text.txt","r");if(fp==NULL){printf("文件打开失败\n");while(1);}while(!feof(fp)){text[l] = fgetc(fp);l++;}printf("输入文本\n");printf("%s\n",text);fclose(fp);Count();HuffmanTree();HuffmanCode();Code();HuffmanDecode();}文本文件文本输入进行哈夫曼编码对文本进行编码输出解码结果3.试验总结经过此次试验, 对二叉树应用有了对应了解, 掌握了怎样结构哈夫曼编码, 怎样对编码结果进行解码。

赫夫曼树实验报告

赫夫曼树实验报告

赫夫曼树实验报告赫夫曼树实验报告引言:赫夫曼树是一种用于数据压缩的重要算法,它通过构建一棵二叉树来实现对数据的编码和解码。

本次实验旨在通过实际操作,深入了解赫夫曼树的原理和应用,并验证其在数据压缩中的有效性。

一、实验背景数据压缩在现代信息技术中起着至关重要的作用。

随着数据量的不断增加,如何有效地压缩数据成为了一个迫切的问题。

赫夫曼树作为一种经典的数据压缩算法,具有较高的压缩比和较快的解压速度,因此备受关注。

二、实验目的1. 了解赫夫曼树的原理和构建方法;2. 掌握赫夫曼编码的过程和步骤;3. 验证赫夫曼树在数据压缩中的有效性。

三、实验过程1. 构建赫夫曼树首先,我们需要统计待压缩数据中各个字符的出现频率。

然后,按照频率从小到大的顺序,将字符构建成一棵二叉树。

具体构建方法为:每次选取频率最低的两个字符,将它们作为左右子节点,生成一个新的节点,该节点的频率为左右子节点频率之和。

重复此过程,直到所有字符都被构建成树的节点。

2. 进行赫夫曼编码在赫夫曼树构建完成后,我们需要对每个字符进行编码。

编码的规则是:向左走为0,向右走为1。

从根节点开始,对每个字符进行路径搜索,直到找到对应的叶子节点,记录下路径上的0和1,即为该字符的编码。

3. 数据压缩与解压缩利用赫夫曼编码,我们可以对待压缩数据进行压缩。

将每个字符替换为对应的编码后,将所有编码拼接起来,即可得到压缩后的数据。

解压缩则是将编码根据赫夫曼树进行反向解码,得到原始数据。

四、实验结果通过实验,我们将不同类型的数据进行了压缩和解压缩,并与原始数据进行了对比。

结果表明,赫夫曼树在数据压缩中表现出色,能够显著减小数据的大小,同时保持数据的完整性。

五、实验总结赫夫曼树作为一种高效的数据压缩算法,具有广泛的应用前景。

通过本次实验,我们深入了解了赫夫曼树的原理和构建方法,并验证了其在数据压缩中的有效性。

赫夫曼树的应用不仅可以提高数据传输的效率,还可以节省存储空间,对于大数据时代的到来具有重要意义。

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告一、实验内容本次实验的主要内容是哈夫曼树的创建和编码解码。

二、实验目的1. 理解并掌握哈夫曼树的创建过程;2. 理解并掌握哈夫曼编码的原理及其实现方法;3. 掌握哈夫曼树的基本操作,如求哈夫曼编码和哈夫曼解码等;4. 学习如何组织程序结构,运用C++语言实现哈夫曼编码和解码。

三、实验原理哈夫曼树的创建:哈夫曼树的创建过程就是一个不断合并权值最小的两个叶节点的过程。

具体步骤如下:1. 将所有节点加入一个无序的优先队列里;2. 不断地选出两个权值最小的节点,并将它们合并成为一个节点,其权值为这两个节点的权值之和;3. 将新的节点插入到队列中,并继续执行步骤2,直到队列中只剩下一棵树,这就是哈夫曼树。

哈夫曼编码:哈夫曼编码是一种无损压缩编码方式,它根据字符出现的频率来构建编码表,并通过编码表将字符转换成二进制位的字符串。

具体实现方法如下:1. 统计每个字符在文本中出现的频率,用一个数组记录下来;2. 根据字符出现的频率创建哈夫曼树;3. 从根节点开始遍历哈夫曼树,给左分支打上0的标记,给右分支打上1的标记。

遍历每个叶节点,将对应的字符及其对应的编码存储在一个映射表中;4. 遍历文本中的每个字符,查找其对应的编码表,并将编码字符串拼接起来,形成一个完整的编码字符串。

哈夫曼解码就是将编码字符串还原为原始文本的过程。

具体实现方法如下:1. 从根节点开始遍历哈夫曼树,按照编码字符串的位数依次访问左右分支。

如果遇到叶节点,就将对应的字符记录下来,并重新回到根节点继续遍历;2. 重复步骤1,直到编码字符串中的所有位数都被遍历完毕。

四、实验步骤1. 定义编码和解码的结构体以及相关变量;3. 遍历哈夫曼树,得到每个字符的哈夫曼编码,并将编码保存到映射表中;4. 将文本中的每个字符用其对应的哈夫曼编码替换掉,并将编码字符串写入到文件中;5. 使用哈夫曼编码重新构造文本,并将结果输出到文件中。

五、实验总结通过本次实验,我掌握了哈夫曼树的创建和哈夫曼编码的实现方法,也学会了如何用C++语言来组织程序结构,实现哈夫曼编码和解码。

哈夫曼树 实验报告

哈夫曼树 实验报告

哈夫曼树实验报告哈夫曼树实验报告引言:哈夫曼树是一种经典的数据结构,广泛应用于数据压缩、编码和解码等领域。

本次实验旨在通过构建哈夫曼树,探索其原理和应用。

一、哈夫曼树的定义和构建方法哈夫曼树是一种特殊的二叉树,其叶子节点对应于待编码的字符,而非叶子节点则是字符的编码。

构建哈夫曼树的方法是通过贪心算法,即每次选择权值最小的两个节点合并,直到构建出完整的哈夫曼树。

二、哈夫曼编码的原理和实现哈夫曼编码是一种可变长度编码,即不同字符的编码长度不同。

其原理是通过构建哈夫曼树来确定字符的编码,使得频率较高的字符编码较短,频率较低的字符编码较长。

这样可以有效地减少编码的长度,从而实现数据的压缩。

三、实验过程和结果在本次实验中,我们选择了一段文本作为输入数据,通过统计每个字符的频率,构建了对应的哈夫曼树。

然后,根据哈夫曼树生成了字符的编码表,并将原始数据进行了编码。

最后,我们通过对编码后的数据进行解码,验证了哈夫曼编码的正确性。

实验结果显示,通过哈夫曼编码后,原始数据的长度明显减少,达到了较好的压缩效果。

同时,解码后的数据与原始数据完全一致,证明了哈夫曼编码的可靠性和正确性。

四、哈夫曼树的应用哈夫曼树在实际应用中有着广泛的用途。

其中,最典型的应用之一是数据压缩。

通过使用哈夫曼编码,可以将大量的数据压缩为较小的存储空间,从而节省了存储资源。

此外,哈夫曼树还被广泛应用于网络传输、图像处理等领域,提高了数据传输的效率和图像的质量。

五、对哈夫曼树的思考哈夫曼树作为一种经典的数据结构,其优势在于有效地减少了数据的冗余和存储空间的占用。

然而,随着技术的不断发展,现代的数据压缩算法已经不再局限于哈夫曼编码,而是采用了更为复杂和高效的算法。

因此,我们需要在实际应用中综合考虑各种因素,选择合适的压缩算法。

六、总结通过本次实验,我们深入了解了哈夫曼树的原理和应用。

哈夫曼编码作为一种重要的数据压缩算法,具有广泛的应用前景。

在实际应用中,我们需要根据具体情况选择合适的压缩算法,以达到最佳的压缩效果和性能。

哈夫曼树实验报告

哈夫曼树实验报告

哈夫曼树实验报告一、需求分析(1)输入输出形式输入数组的组数n: 整形变量组数(回车)请依次输入n组权值与字符, 中间用空格隔开。

如“2 a”:按右提示格式输入(回车)请输入待编译文本: 随机输入字符(回车)输出: 编译出的代码请输入待编译代码: 随机输入一串代码(回车)(2)输出: 编译出的代码(3)程序功能1. 用C语言实现二叉树的说明2. 输入n个权值, 并生成n个二叉树3. 对n个二叉树逐步生成Huffman树4. 对Huffman树的每个叶子结点生成编码5.用哈夫曼树编码。

6.解码哈夫曼编码。

(4)测试用例设计Example1: 输入325 a15 b60 cabbacc010*******输出010*******abbaccExample2: 输入510 a20 b30 c20 d10 eababcde10000100001101101输出10000100001101101ababcde二、概要设计1.根据给定的n个权值(w1, w2, …, wn)构成n棵二叉树的集合F={T1, T2, …, Tn}, 其中每棵二叉树Ti中只有一个带树为Ti的根结点在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树, 且置其根结点的权值为其左右子树权值之和3.在F中删除这两棵树, 同时将新得到的二叉树加入F中4.重复2, 3, 直到F只含一棵树为止三、 5.将给定的字符串通过程序编码成哈夫曼编码, 并打印结果在屏幕上。

四、 6.翻译给定的哈夫曼编码变成可读字符串, 并将结果打印在屏幕上。

五、详细设计四、调试分析(1)编译代码、运行代码所遇到的问题及其解决办法问题1: 编译代码过程中有遇到循环体的循环次数不对, 导致二叉树生成得不对解决办法:通过小数字的演算, 检验循环, 再进行更改(2)算法的时空分析(3)心得体会五、用户使用说明如上图所示, 依次输入组数、权值及全值所对应字符。

再根据用户自身需求输入需编译的文本及代码。

哈夫曼树实验报告

哈夫曼树实验报告

哈夫曼树实验报告一、实验目的1.理解哈夫曼树的概念和实现原理;2.掌握使用哈夫曼树进行编码和解码的方法;3.熟悉哈夫曼树在数据压缩中的应用。

二、实验原理哈夫曼树是一种用于数据压缩的树形结构,通过将出现频率较高的数据项用较短的编码表示,从而达到压缩数据的目的。

哈夫曼树的构建过程如下:1.统计字符出现的频率,并按照频率从小到大排序;2.将频率最低的两个字符合并为一个节点,节点的频率为两个字符的频率之和;3.将新节点插入频率表,并将频率表重新排序;4.重复步骤2和3,直到频率表中只剩下一个节点,该节点即为哈夫曼树的根节点。

三、实验步骤1.统计输入的字符序列中每个字符出现的频率;2.根据频率构建哈夫曼树;3.根据哈夫曼树生成字符的编码表;4.将输入的字符序列编码为哈夫曼编码;5.根据哈夫曼树和编码表,解码得到原始字符序列。

四、实验结果以字符序列"abacabad"为例进行实验:1.统计字符频率的结果为:a-4次,b-2次,c-1次,d-1次;```a-4/\b-2c-1/\d-1空节点```3.根据哈夫曼树生成的编码表为:a-0,b-10,c-110,d-111;5. 根据哈夫曼树和编码表进行解码得到原始字符序列:"abacabad"。

五、实验总结通过本次实验,我深入了解了哈夫曼树的原理和实现方法,掌握了使用哈夫曼树进行字符编码和解码的过程。

哈夫曼树在数据压缩中的应用非常广泛,能够有效地减小数据的存储空间,提高数据传输效率。

在实际应用中,我们可以根据不同字符出现的频率构建不同的哈夫曼树,从而实现更高效的数据压缩和解压缩算法。

哈夫曼实验报告

哈夫曼实验报告

一、实验目的1. 理解哈夫曼编码的基本原理和重要性。

2. 掌握哈夫曼树的构建方法。

3. 熟悉哈夫曼编码和译码的实现过程。

4. 分析哈夫曼编码在数据压缩中的应用效果。

二、实验原理哈夫曼编码是一种基于字符频率的编码方法,它利用字符出现的频率来构造一棵最优二叉树(哈夫曼树),并根据该树生成字符的编码。

在哈夫曼树中,频率越高的字符对应的编码越短,频率越低的字符对应的编码越长。

这样,对于出现频率较高的字符,编码后的数据长度更短,从而实现数据压缩。

三、实验内容1. 构建哈夫曼树:- 统计待编码数据中每个字符出现的频率。

- 根据字符频率构建哈夫曼树,其中频率高的字符作为叶子节点,频率低的字符作为内部节点。

- 重复上述步骤,直到树中只剩下一个节点,即为哈夫曼树的根节点。

2. 生成哈夫曼编码:- 从哈夫曼树的根节点开始,对每个节点进行遍历,根据遍历方向(左子树为0,右子树为1)为字符分配编码。

- 将生成的编码存储在编码表中。

3. 编码和译码:- 使用生成的编码表对原始数据进行编码,将编码后的数据存储在文件中。

- 从文件中读取编码后的数据,根据编码表进行译码,恢复原始数据。

四、实验步骤1. 编写代码实现哈夫曼树的构建:- 定义节点结构体,包含字符、频率、左子树、右子树等属性。

- 实现构建哈夫曼树的核心算法,包括节点合并、插入等操作。

2. 实现编码和译码功能:- 根据哈夫曼树生成编码表。

- 编写编码函数,根据编码表对数据进行编码。

- 编写译码函数,根据编码表对数据进行译码。

3. 测试实验效果:- 选择一段文本数据,使用实验代码进行编码和译码。

- 比较编码前后数据的长度,分析哈夫曼编码的压缩效果。

五、实验结果与分析1. 哈夫曼树构建:- 成功构建了哈夫曼树,树中节点按照字符频率从高到低排列。

2. 哈夫曼编码:- 成功生成编码表,字符与编码的对应关系符合哈夫曼编码原理。

3. 编码与译码:- 成功实现编码和译码功能,编码后的数据长度明显缩短,译码结果与原始数据完全一致。

哈弗曼树实验报告(3篇)

哈弗曼树实验报告(3篇)

一、实验目的1. 理解并掌握哈弗曼树的构建原理。

2. 学会使用哈弗曼树进行数据编码和解码。

3. 了解哈弗曼编码在数据压缩中的应用。

二、实验原理哈弗曼树(Huffman Tree)是一种带权路径长度最短的二叉树,用于数据压缩。

其基本原理是:将待编码的字符集合按照出现频率从高到低排序,构造一棵二叉树,使得叶子节点代表字符,内部节点代表编码,权值代表字符出现的频率。

通过这棵树,可以生成每个字符的编码,使得编码的平均长度最小。

三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019四、实验步骤1. 构建哈弗曼树(1)创建一个结构体`HuffmanNode`,包含字符、权值、左子树和右子树指针。

```cppstruct HuffmanNode {char data;int weight;HuffmanNode left;HuffmanNode right;};(2)定义一个函数`HuffmanTree()`,用于创建哈弗曼树。

```cppHuffmanNode HuffmanTree(std::vector<char>& chars, std::vector<int>& weights) {// 创建初始二叉树std::vector<HuffmanNode> trees;for (int i = 0; i < chars.size(); ++i) {trees.push_back(new HuffmanNode{chars[i], weights[i], nullptr, nullptr});}// 构建哈弗曼树while (trees.size() > 1) {// 选择两个权值最小的节点auto it1 = std::min_element(trees.begin(), trees.end(),[](HuffmanNode a, HuffmanNode b) {return a->weight < b->weight;});auto it2 = std::next(it1);HuffmanNode parent = new HuffmanNode{0, it1->weight + it2->weight, it1, it2};// 删除两个子节点trees.erase(it1);trees.erase(it2);// 将父节点添加到二叉树集合中trees.push_back(parent);}// 返回哈弗曼树根节点return trees[0];}```2. 生成哈弗曼编码(1)定义一个函数`GenerateCodes()`,用于生成哈弗曼编码。

赫夫曼树的实验报告

赫夫曼树的实验报告

一、实验目的1. 理解赫夫曼树的概念和原理;2. 掌握赫夫曼树的构建方法;3. 学会使用赫夫曼树进行数据压缩和解压缩;4. 了解赫夫曼树在实际应用中的优势。

二、实验原理赫夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。

在构建赫夫曼树的过程中,每次选择两个权值最小的节点作为左右子节点,然后合并成一个新的节点,权值为两个子节点权值之和。

重复此过程,直到只剩下一个节点,即为赫夫曼树的根节点。

赫夫曼树在数据压缩中的应用主要体现在编码和解码过程中。

通过对字符进行赫夫曼编码,可以将字符序列转换成二进制序列,从而减少数据存储空间。

在解码过程中,根据赫夫曼树的结构,可以将二进制序列还原成原始字符序列。

三、实验内容1. 构建赫夫曼树(1)输入字符及其权值,例如:A=5, B=9, C=12, D=13, E=16, F=45。

(2)将输入的字符和权值放入最小堆中,每次取出两个最小权值的节点,合并成一个新的节点,权值为两个子节点权值之和。

(3)重复步骤(2),直到只剩下一个节点,即为赫夫曼树的根节点。

2. 使用赫夫曼树进行数据压缩和解压缩(1)根据赫夫曼树生成字符的编码,例如:A=01, B=100, C=101, D=110, E=1110, F=1111。

(2)对输入的字符序列进行编码,例如:输入字符串"ABCDEF",编码后为"01010010101111111111"。

(3)将编码后的二进制序列存储或传输。

(4)接收方根据赫夫曼树的结构,对二进制序列进行解码,还原成原始字符序列。

四、实验结果与分析1. 实验结果(1)构建赫夫曼树```F/ \B D/ \ / \A C E G```(2)字符编码```A=01, B=100, C=101, D=110, E=1110, F=1111```(3)输入字符串"ABCDEF"的编码结果为"01010010101111111111"。

数据结构实验哈夫曼树及哈夫曼编码c语言

数据结构实验哈夫曼树及哈夫曼编码c语言

数据结构实验报告:哈夫曼树及哈夫曼编码一、实验目的1. 理解哈夫曼树及哈夫曼编码的概念和原理;2. 掌握C语言中哈夫曼树及哈夫曼编码的实现方法;3. 分析和讨论哈夫曼编码在实际应用中的优势和不足。

二、实验内容和步骤1. 哈夫曼树的构建1.1 通过C语言实现哈夫曼树的构建算法;1.2 输入一组权值,按哈夫曼树构建规则生成哈夫曼树;1.3 输出生成的哈夫曼树结构,并进行可视化展示。

2. 哈夫曼编码的实现2.1 设计哈夫曼编码的实现算法;2.2 对指定字符集进行编码,生成哈夫曼编码表;2.3 对给定字符串进行哈夫曼编码,并输出编码结果。

三、实验过程及结果1. 哈夫曼树的构建在C语言中,通过定义结构体和递归算法实现了哈夫曼树的构建。

根据输入的权值,依次选择权值最小的两个节点构建新的父节点,直至构建完成整棵哈夫曼树。

通过调试和可视化展示,确认了程序正确实现了哈夫曼树的构建。

2. 哈夫曼编码的实现经过分析和设计,利用哈夫曼树的特点实现了哈夫曼编码的算法。

根据生成的哈夫曼树,递归地生成字符对应的哈夫曼编码,并输出编码结果。

对指定的字符串进行了编码测试,验证了哈夫曼编码的正确性和有效性。

四、实验结果分析1. 哈夫曼编码在数据传输和存储中具有较高的压缩效率和可靠性,能够有效减少数据传输量和存储空间;2. 哈夫曼树及哈夫曼编码在通信领域、数据压缩和加密等方面有着广泛的应用和重要意义;3. 在实际应用中,哈夫曼编码的构建和解码算法需要较大的时间和空间复杂度,对于大规模数据的处理存在一定的局限性。

五、实验总结通过本次实验,深入理解了哈夫曼树及哈夫曼编码的理论知识,并掌握了C语言中实现哈夫曼树及哈夫曼编码的方法。

对哈夫曼编码在实际应用中的优势和局限性有了更深入的认识,这对今后的学习和工作有着积极的意义。

六、参考文献1. 《数据结构(C语言版)》,严蔚敏赵现军著,清华大学出版社,2012年;2. 《算法导论》,Thomas H. Cormen 等著,机械工业出版社,2006年。

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告一、实验目的本次实验的主要目的是深入理解和掌握哈夫曼树的数据结构及其相关算法,并通过实际编程实现来提高对数据结构的应用能力和编程技能。

二、实验环境本次实验使用的编程环境为具体编程语言名称,操作系统为具体操作系统名称。

三、实验原理哈夫曼树,又称最优二叉树,是一种带权路径长度最短的二叉树。

其基本原理是通过构建一棵二叉树,使得权值较大的节点距离根节点较近,权值较小的节点距离根节点较远,从而达到带权路径长度最小的目的。

在构建哈夫曼树的过程中,首先需要将所有的节点按照权值从小到大进行排序。

然后,选取权值最小的两个节点作为左右子树,构建一个新的父节点,该父节点的权值为左右子节点权值之和。

重复这个过程,直到所有的节点都被构建到哈夫曼树中。

哈夫曼编码是基于哈夫曼树的一种编码方式。

对于每个叶子节点,从根节点到该叶子节点的路径上,向左的分支编码为 0,向右的分支编码为 1,这样就可以得到每个叶子节点的哈夫曼编码。

四、实验步骤1、定义节点结构体```ctypedef struct HuffmanNode {char data;int weight;struct HuffmanNode left;struct HuffmanNode right;} HuffmanNode;```2、实现节点排序函数```cvoid sortNodes(HuffmanNode nodes, int n) {for (int i = 0; i < n 1; i++){for (int j = 0; j < n i 1; j++){if (nodesj>weight > nodesj + 1>weight) {HuffmanNode temp = nodesj;nodesj = nodesj + 1;nodesj + 1 = temp;}}}}```3、构建哈夫曼树```cHuffmanNode buildHuffmanTree(HuffmanNode nodes, int n) {while (n > 1) {sortNodes(nodes, n);HuffmanNode left = nodes0;HuffmanNode right = nodes1;HuffmanNode parent =(HuffmanNode )malloc(sizeof(HuffmanNode));parent>data ='\0';parent>weight = left>weight + right>weight;parent>left = left;parent>right = right;nodes0 = parent;nodes1 = nodesn 1;n;}return nodes0;}```4、生成哈夫曼编码```cvoid generateHuffmanCodes(HuffmanNode root, int codes, int index) {if (root>left) {codesindex = 0;generateHuffmanCodes(root>left, codes, index + 1);}if (root>right) {codesindex = 1;generateHuffmanCodes(root>right, codes, index + 1);}if (!root>left &&!root>right) {printf("%c: ", root>data);for (int i = 0; i < index; i++){printf("%d", codesi);}printf("\n");}}```5、主函数```cint main(){HuffmanNode nodes5 ={(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode))};nodes0>data ='A';nodes0>weight = 5;nodes1>data ='B';nodes1>weight = 9;nodes2>data ='C';nodes2>weight = 12;nodes3>data ='D';nodes3>weight = 13;nodes4>data ='E';nodes4>weight = 16;HuffmanNode root = buildHuffmanTree(nodes, 5);int codes100;generateHuffmanCodes(root, codes, 0);return 0;}```五、实验结果与分析通过运行上述程序,得到了每个字符的哈夫曼编码:A: 00B: 01C: 10D: 110E: 111分析实验结果可以发现,权值较小的字符A 和B 对应的编码较短,而权值较大的字符D 和E 对应的编码较长。

哈夫曼树实验报告

哈夫曼树实验报告

一、实验目的1. 理解哈夫曼树的基本概念和构造方法。

2. 掌握哈夫曼编码的原理和实现过程。

3. 通过实验加深对数据结构中树型结构应用的理解。

二、实验原理哈夫曼树(Huffman Tree)是一种带权重的二叉树,用于实现哈夫曼编码。

其基本思想是:将字符按照在数据集中出现的频率进行排序,然后选取两个最小频率的字符合并成一个新节点,其频率为两个字符频率之和,重复此过程,直到只剩下一个节点,即为哈夫曼树的根节点。

哈夫曼编码是一种基于哈夫曼树的编码方法,其原理是将每个字符映射到一个唯一的二进制序列,序列的长度与字符在数据集中出现的频率成反比。

频率越高,编码的长度越短,从而提高信息传输的效率。

三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019四、实验步骤1. 初始化(1)从数据文件中读取字符及其频率。

(2)构建一个优先队列(最小堆),将字符和频率存储在队列中。

2. 构建哈夫曼树(1)从优先队列中取出两个频率最小的节点,合并成一个新节点,其频率为两个节点频率之和。

(2)将新节点插入优先队列中。

(3)重复步骤(1)和(2),直到优先队列中只剩下一个节点,即为哈夫曼树的根节点。

3. 哈夫曼编码(1)遍历哈夫曼树,从根节点到叶子节点的路径上,左子树表示0,右子树表示1。

(2)将每个叶子节点的字符和对应的编码存储在哈夫曼编码表中。

4. 编码(1)读取待编码的文本。

(2)根据哈夫曼编码表,将文本中的每个字符映射到对应的编码。

(3)将编码序列写入文件。

5. 译码(1)读取编码文件。

(2)从哈夫曼树的根节点开始,根据编码序列的每一位,判断是左子树还是右子树。

(3)当到达叶子节点时,输出对应的字符。

(4)重复步骤(2)和(3),直到编码序列结束。

五、实验结果与分析1. 实验结果(1)成功构建了哈夫曼树,并生成了哈夫曼编码表。

(2)对给定的文本进行了编码和译码,验证了编码的正确性。

2021年哈夫曼树编码译码实验报告

2021年哈夫曼树编码译码实验报告

数据结构课程设计欧阳光明(2021.03.07)设计题目:哈夫曼树编码译码目录第一章需求分析1第二章设计要求1第三章概要设计2(1)其主要流程图如图1-1所示。

3(2)设计包含的几个方面4第四章详细设计4(1)①哈夫曼树的存储结构描述为:4(2)哈弗曼编码5(3)哈弗曼译码7(4)主函数8(5)显示部分源程序:8第五章调试结果10第六章心得体会12第七章参考文献12附录:12第一章需求分析在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。

哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。

这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。

哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是哈夫曼编码。

哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。

第二章设计要求对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串。

但在信息传递时,总希望总长度能尽可能短,即采用最短码。

假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为∑WiLi。

2021年数据结构哈夫曼树编码译码实验报告

2021年数据结构哈夫曼树编码译码实验报告

【详细设计】欧阳光明(2021.03.07)具体代码实现如下://HaffmanTree.h#include<iostream>#include<fstream>#include<string>struct HuffmanNode //哈夫曼树的一个结点{int weight;int parent;int lchild,rchild;};class HuffmanTree //哈夫曼树{private:HuffmanNode *Node; //Node[]存放哈夫曼树char *Info; //Info[]存放源文用到的字符——源码,如'a','b','c','d','e',此内容可以放入结点中,不单独设数组存放int LeafNum; //哈夫曼树的叶子个数,也是源码个数public:HuffmanTree();~HuffmanTree();void CreateHuffmanTree(); /*在内存中建立哈夫曼树,存放在Node[]中。

让用户从两种建立哈夫曼树的方法中选择:1.从键盘读入源码字符集个数,每个字符,和每个字符的权重,建立哈夫曼树,并将哈夫曼树写入文件hfmTree中。

2.从文件hfmTree中读入哈夫曼树信息,建立哈夫曼树*/void CreateHuffmanTreeFromKeyboard();void CreateHuffmanTreeFromFile();void Encoder(); /*使用建立好的哈夫曼树(如果不在内存,则从文件hfmTree中读入并建立内存里的哈夫曼树),对文件ToBeTran中的正文进行编码,并将码文写入文件CodeFile 中。

ToBeTran的内容可以用记事本等程序编辑产生。

*/void Decoder(); /*待译码的码文存放在文件CodeFile中,使用建立好的哈夫曼树(如果不在内存,则从文件hfmTree中读入并建立内存里的哈夫曼树)将码文译码,得到的源文写入文件TextFile中,并同时输出到屏幕上。

2021年哈夫曼实验报告附代码

2021年哈夫曼实验报告附代码

哈弗曼编码/译码器一、程序功效分析1.结构哈夫曼树及哈夫曼编码: 从终端读入字符集大小n、n个字符以及n个对应权值, 建立哈夫曼树; 利用已经建好哈夫曼树求每个叶结点哈夫曼编码, 并保留。

2.编码: 利用已结构哈夫曼编码对“明文”文件中正文进行编码, 然后将结果存入“密文”文件中。

3.译码: 将“密文”文件中0、1代码序列进行译码。

(读文件)4.打印“密文”文件: 将文件以紧凑格式显示在终端上, 每行30个代码; 同时, 将此字符形式编码文件保留。

5.打印哈夫曼树及哈夫曼编码: 将已在内存中哈夫曼树以凹入表形式显示在终端上, 同时将每个字符哈夫曼编码显示出来; 并保留到文件。

二、基础要求分析1、输入输出要求按提醒内容从键盘输入命令, 系统依据用户输入需求在确保界面友好前提下输出用户所需信息, 并按要求保留文件, 方便保留备份信息。

2、测试数据(1).令叶子结点个数N为4, 权值集合为{1,3,5,7}, 字符集合为{A,B,C,D}, 且字符集与权值集合一一对应。

(2).令叶子结点个数N为7, 权值集合为{12,6,8,18,3,20,2}, 字符集合为{A,B,C,D,E,F,G}, 且字符集与权值集合一一对应。

(3).请自行选定一段英文文本, 统计给出字符集, 实际统计字符频度, 建立哈夫曼树, 结构哈夫曼编码, 并实现其编码和译码。

三、概要设计1.主模块步骤及各子模块关键功效主函数负责提供选项功效, 循环调控整个系统。

创建模块实现接收字符、权值、构建哈夫曼树, 并保留文件, 此功效是后续功效基础。

编码模块实现利用已编好哈夫曼树对每个字符进行哈夫曼编码, 即对每个字符译出其密文代码, 并保留文件。

译码模块实现对用户输入密文翻译成明文, 即用户所需字符串信息。

输出模块实现对已编好哈夫曼树以凹入表形式输出。

2、模块之间层次关系四、具体设计1.采取c语言定义相关数据类型(1)结点类型定义描述以下:#define N 叶子结点个数typedef strcut{int weight; /*结点权值*/int parent;int lchild;int rchild;}HNodeType;HNodeType HNode[2*N-1];(2)编码类型定义描述以下:#define MAXBIT 10typedef struct{int bit[MAXBIT];int start;}HCodeType;HCodeType HCode[N];2.各模块伪算法(1)主函数int main(){do:{界面友好设计;cout<<各个选项功效内容;cin>>ch;容错处理;switch(ch){case 1:.....}}while();return 0;}(2)系统初始化模块void create() //系统初始化{for(i=0;i<2*N-1;i++) //数组HNode初始化{};从键盘接收字符;for(i=0;i<N;i++){ cout<<"输入字符"<<endl;cin>>HNode[i].data;}接收权值;结构哈夫曼树;for(i=0;i<N-1;i++){ 找最小和次小两个权值;将找出两棵子树合并为一棵子数;}将已建好哈夫曼树存入文件hfmtree.txt中;调用哈夫曼编码子函数;}void HaffmanCode() //对哈夫曼树进行编码{从hfmtree.txt文件中读出哈夫曼树信息存入内存HNodeType a[2*N-1];求每个叶子结点哈夫曼编码;for(i=0;i<N;i++){从叶节点回溯, 回溯到根结点(parent==-1);统计回溯路径;}打印出每个字符对应密文;将密文信息存入文件codefile.dat中;}(3)编码模块void HfmanCode() //对用户输入字符串进行编码{提醒输入信息;接收用户输入要编译字符串;cin>>s;//从文件中读取哈夫曼编码信息infile.open ("F:\\codefile.dat",ios::in|ios::binary); //读文件for(i=0;i<N;i++) //将文件中数据读出放在temp[i]内//从文件中读字节到指定存放器区域。

2021年数据结构哈夫曼树的实验报告

2021年数据结构哈夫曼树的实验报告

软件学院设计性试验汇报了解哈夫曼树特征及其应用; 在对哈夫曼树进行了解基础上, 结构哈夫曼树, 并用结构哈夫曼树进行编码和译码; 经过该试验, 使学生对数据结构应用有更深层次了解。

二、试验仪器或设备学院提供公共机房, 1台/学生微型计算机。

三、总体设计(设计原理、设计方案及步骤等)1.问题描述:利用哈夫曼编码进行通信能够大大提升信道利用率, 缩短信息传输时间, 降低传输成本。

不过, 这要求在发送端经过一个编码系统对待传数据预先编码, 在接收端将传来数据进行译码(解码)。

对于双工信道(即能够双向传输信息信道), 每端都需要一个完整编/译码系统。

试为这么信息收发站设计一个哈夫曼编/译码系统。

2.一个完整系统应含有以下功效:1)初始化(Initialzation)。

从数据文件DataFile.dat中读入字符及每个字符权值, 建立哈夫曼树HuffTree;2)编码(EnCoding)。

用已建好哈夫曼树, 对文件ToBeTran.dat汉字本进行编码形成报文, 将报文写在文件Code.txt中;3)译码(Decoding)。

利用已建好哈夫曼树, 对文件CodeFile.dat中代码进行解码形成原文, 结果存入文件Textfile.txt中;4)输出(Output): 输出DataFile.dat中出现字符以及各字符出现频度(或概率); 输出ToBeTran.dat及其报文Code.txt; 输出CodeFile.dat及其原文Textfile.txt;要求: 所设计系统应能在程序实施过程中, 依据实际情况(不一样输入)建立DataFile.dat、ToBeTran.dat和CodeFile.dat三个文件, 以确保系统通用性。

四、试验步骤(包含关键步骤、代码分析等)1)编写C语言程序#include<string.h>#include<malloc.h>#include<stdio.h>#include<iostream.h>#include<math.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1typedef struct{char data;int weight;int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char **HuffmanCode;void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char *d,int *w,int n) //结构哈弗曼函数HT, 结构编码HC{void select(HuffmanTree HT,int n,int &s1,int &s2);int m,c,f,j;HuffmanTree p;int i,s1,s2,start;char *cd;m=2*n-1; //m为结点数, n为叶子数HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));p=HT;p++;for(i=1;i<=n;i++,p++) //将叶子值输入HT中{p->data=d[i]; //={*d,*w,0,0,0};p->weight=w[i];p->parent=0;p->lchild=0;p->rchild=0;}for (i=n+1;i<=m;i++,p++) //={'#',0,0,0,0} {p->data='#';p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}s1=1;s2=2;for(i=n+1;i<=m;i++) //构建哈夫曼树{select(HT,i-1,s1,s2);HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;HT[s1].parent=i;HT[s2].parent=i;}HC=(HuffmanCode)malloc((n+1)*sizeof(HuffmanTree)); //开辟空间, 编码cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';for (i=1;i<=n;++i){start=n-1;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent){if(HT[f].lchild==c)cd[--start]='0';elsecd[--start]='1';}HC[i]=(char*)malloc((n-start)*sizeof(char));strcpy(HC[i],&cd[start]);printf("%c编码是: ",HT[i]);puts(HC[i]);}free(cd);}void select(HuffmanTree HT,int n,int &s1,int &s2) //求最小两数{int i,t;s1=1;s2=2;while(HT[s1].parent!=0)s1++;while((HT[s2].parent!=0)||(s1==s2))s2++;/*for(i=1;i<=n;i++){if(HT[s1].weight>HT[i].weight&&HT[i].parent==0&&s2!=i)s1=i;}if(HT[s1].weight>HT[s2].weight){t=s1;s1=s2;s2=t;}for(i=1;i<=n;i++){if(s1!=i){if(HT[s2].weight>HT[i].weight&&HT[i].parent==0)s2=i;}}*/for(i=1;i<=n;i++){if(s1!=i&&i!=s2){if(HT[i].weight<HT[s1].weight&&HT[i].parent==0&&i!=s2) {if(HT[s1].weight<HT[s2].weight) s2=s1;s1=i;}elseif(HT[i].weight<HT[s2].weight&&HT[i].parent==0&&s1!=i) s2=i;}}}void translation(HuffmanTree HT,int num){char str[20];int i,t=num;printf("请输入由0或1组成编码: ");cin>>str;//t=HT; //t为树指向各节点指针for(i=0;i<(strlen(str));i++){if(str[i]=='0')t=HT[t].lchild;elseif(str[i]=='1')t=HT[t].rchild;else{printf("编码输入错误");break;}if(!(HT[t].lchild&&HT[t].rchild)){printf("%c",HT[t].data);t=num;}}printf("\n");}void main(){void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char d[],int w[],int n);void translation(HuffmanTree HT,int num);HuffmanTree HT=NULL;HuffmanCode HC=NULL;char data,n,*p,*d;int *w,wei,i,num;printf("please intput character number:");scanf("%d",&n);d=(char*)malloc((n+1)*sizeof(char));w=(int *)malloc((n+1)*sizeof(int));printf("请输入Huffman树中字符: \n");for(i=1;i<=n;i++){cin>>data;d[i]=data;}printf("请输入%d次位权\n:",n);for (i=1;i<=n;i++){cin>>wei;w[i]=wei;}num=2*n-1;HuffmanCoding(HT,HC,d,w,n);translation(HT,num);}2)程序分析此试验是结构哈夫曼树, 求出哈夫曼编码然后输出结构哈夫曼树算法操作时选出两棵根节点权值最小一颗树左右子树, 且置新树根节点权值为其左右子树上根节点权值之和, 依据哈夫曼树求出带权路径算法操作是用递归调用方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

六.实验截图
七实验体会
1、构建哈夫曼树的关键在于找最小树;在F中选择两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且至新的二叉树的根结点的权值为其左右子树上根结点的权值之和。

2、由于学习的不足没有实现编码文件的译码,今后会加以改进 (╯﹏╰)
3、在逆向求编码的for循环里犯了一个逻辑错误导致求出来的3、4位编码串行,尝试了多钟数据输入才找到原因所在,并加以改正,编写程序需一步一步的去调试并找到错误所在。

附源程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef struct
{
char data; //结点字符
int weight; //结点权值
int parent,lchild,rchild; //父子结点
}HTNode,* HuffmanTree;
typedef char * *HuffmanCode;
void Select(HuffmanTree HT, int m, int& s1, int& s2)
{
int i;
s1 = s2 = 1;
for(i=1; i<=m; i++)
{
if (HT[i].parent==0)
{
s1=i;
break;
}
}
for(i=i+1; i<=m; i++)
{
if (HT[i].parent==0 && HT[s1].weight>HT[i].weight)
s1=i;。

相关文档
最新文档