二叉树的应用实验报告.doc

上传人:大张伟 文档编号:5710914 上传时间:2020-07-24 格式:DOC 页数:13 大小:28KB
返回 下载 相关 举报
二叉树的应用实验报告.doc_第1页
第1页 / 共13页
二叉树的应用实验报告.doc_第2页
第2页 / 共13页
二叉树的应用实验报告.doc_第3页
第3页 / 共13页
二叉树的应用实验报告.doc_第4页
第4页 / 共13页
二叉树的应用实验报告.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《二叉树的应用实验报告.doc》由会员分享,可在线阅读,更多相关《二叉树的应用实验报告.doc(13页珍藏版)》请在三一文库上搜索。

1、实 验 报 告课程名称 _数据结构上机实验_实验项目 _二叉树的应用 _实验仪器 _PC机_系 别_专 业_ 班级/学号_学生姓名 _ 实验日期 _成 绩 _ 指导教师 _实验三.二叉树的应用1. 实验目的:掌握二叉树的链式存储结构和常用算法。利用哈夫曼树设计最优压缩编码。 2. 实验内容:1) 编写函数,实现建立哈夫曼树和显示哈夫曼树的功能。2) 编写函数,实现生成哈夫曼编码的功能。3) 编写主函数,从终端输入一段英文文本;统计各个字符出现的频率,然后构建哈夫曼树并求出对应的哈夫曼编码;显示哈夫曼树和哈夫曼编码。选做内容:修改程序,选择实现以下功能:4) 编码:用哈夫曼编码对一段英文文本进行

2、压缩编码,显示编码后的文本编码序列;5) 统计:计算并显示文本的压缩比例;6) 解码:将采用哈夫曼编码压缩的文本还原为英文文本。3. 算法说明:1) 二叉树和哈夫曼树的相关算法见讲义。2) 编码的方法是:从头开始逐个读取文本字符串中的每个字符,查编码表得到它的编码并输出。重复处理直至文本结束。3) 解码的方法是:将指针指向哈夫曼树的树根,从头开始逐个读取编码序列中的每位,若该位为1则向右子树走,为0则向左子树走。当走到叶子节点时,取出节点中的字符并输出。重新将指针放到树根,继续以上过程直至编码序列处理完毕。4) 压缩比例的计算:编码后的文本长度为编码序列中的0和1,的个数,原文本长度为字符数*

3、8。两者之比即为压缩比。4. 实验步骤:实现哈夫曼树的编码序列操作: int i=0,j=0;huffnode p;p=tree2*n-2;/序号2*n-2节点就是树根节点while(hfmstri!=0)/从头开始扫描每个字符,直到结束while(p.lchild!=-1&p.rchild!=-1)if(hfmstri=0)/为0则向左子树走p=treep.lchild;/取出叶子节点中的字符else if(hfmstri=1)/为1则向右子树走p=treep.rchild;/取出叶子节点中的字符i+;decodestrj=p.data;j+;/对字符进行译码,结果放在decodestr字符

4、串中p=tree2*n-2;/返回根节点程序修改后完整源代码如下: #include #include #include #include /专门用于检测整型数据数据类型的表达值范围#define N 96 /ASCII字符集包含至多N个可见字符typedef struct /Huffman树节点定义 char data; /字符值int weight; /权重int lchild; /左子结点int rchild; /右子结点 huffnode; /huffman节点类型struct charcode int count; /字符出现的次数(频率)char codeN; /字符的Huffma

5、n编码 codesetN; /编码表,长为N,每项对应一个ascii码字符,下标i的项对应ascii编码为i+32的字符huffnode * CreateHufftree(char data, int weight, int n) /建立Huffman树的算法int i,k;int min1,min2,min_i1,min_i2;huffnode *tree;tree=(huffnode *)malloc(2*n-1)*sizeof(huffnode); /为Huffman树分配2n-1个节点空间for (i=0;i2*n-1;i+) /初始化,将各字符和其频率填入Huffman树,作为叶子结

6、点 treei.lchild=treei.rchild=-1;if (in) treei.data=datai;treei.weight=weighti;else treei.data= ; for (i=n;i2*n-1;i+) /合并两棵树,作n-1遍min1=min2=INT_MAX; /INT_MAX为最大值min_i1=min_i2=-1;for (k=0;k=0) /仅在根节点中找if (treek.weightmin1)min2=min1;min_i2=min_i1;min1=treek.weight;min_i1=k;else if (treek.weight=0;i-) pr

7、intf(%dt,i); printf(%ct,treei.data); printf(%dt,treei.lchild); printf(%dt,treei.rchild); printf(%dt,treei.weight); printf(n); void EnCoding(char str, char hfmstr)/根据codeset编码表,逐个将str字符串中的字符转化为它的huffman编码,结果编码串放在hfmstr字符串中int i, j;hfmstr0=0;/把hfmstr串赋空i=0;while(stri!=0)/从第头开始扫描str的每个字符,一直到该字符的结束 j=st

8、ri-32;/执行字符到huffman的转换strcat(hfmstr, codesetj.code);/把codest编码串添加到hfmstr结尾处i+;/每次循环完i的值加1void DeCoding(huffnode tree, int n, char hfmstr, char decodestr)/根据tree数组中的huffman树,逐个对hfmstr字符串中的字符进行译码,结果放在decodestr字符串中int i=0,j=0;huffnode p;p=tree2*n-2;/序号2*n-2节点就是树根节点while(hfmstri!=0)/从头开始扫描每个字符,直到结束while

9、(p.lchild!=-1&p.rchild!=-1)/指针为空,儿子的值取完了if(hfmstri=0)/为0则向左子树走p=treep.lchild;/取出叶子节点中的字符else if(hfmstri=1)/为1则向右子树走p=treep.rchild;/取出叶子节点中的字符i+;decodestrj=p.data;j+;/对字符进行译码,结果放在decodestr字符串中p=tree2*n-2;/返回根节点void main() int i,j;huffnode * ht; /Huffman树char dataN; /要编码的字符集合int weightN; /字符集合中各字符的权重(

10、频率)int n=0; /字符集合中字符的个数char str1000; /需输入的原始字符串 char hfm_str1000=; /编码后的字符串char decode_str1000=;/解码后的字符串printf(请输入要转换的字符串n);gets(str);for(i=0;iN;i+) /初始化编码表,频率为0,编码串为空串codeseti.count=0;codeseti.code0=0;i=0; while(stri!=0) /统计原始字符串中各字符出现的频率,存入编码表j=stri-32;codesetj.count+; /codeset095对应ascii码32127的字符i

11、+;for(i=0;iN;i+) /统计原始字符串中出现的字符个数if(codeseti.count!=0) n+;printf(字符频率统计:n); /显示统计结果for(i=0;iN;i+) if(codeseti.count!=0) printf(%c:%d, , i+32, codeseti.count);printf(n);j=0;for(i=0;iN;i+) /生成要编码的字符集合,以及权重if (codeseti.count!=0) dataj=i+32;weightj=codeseti.count; j+;ht=CreateHufftree(data,weight,n); /建

12、立Huffman树,根节点是ht2*n-2 PrintHufftree(ht,n); /显示Huffman树的存储结果CreateHuffcode(ht, 2*n-2, ); /以ht2*n-2为根,以空字符串为起始编码字符串,求出各叶子节点的编码字符串/显示codeset中的Huffman编码,参见显示频率统计结果的代码. printf(haffman编码为:n); for(i=0;iN;i+)if(codeseti.count!=0) printf(%c:%sn,i+32,codeseti.code );EnCoding(str, hfm_str); /对str字符串进行编码,放在hfm_str字符串printf(编码序列: %sn,hfm_str);DeCoding(ht, n, hfm_str, decode_str); /对hfm_str字符串进行译码,放在decode_str字符串中printf(解码后的字符串: %sn,decode_str);free(ht); /释放Huffman树实验总结:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1