二叉树应用Word下载.docx
- 文档编号:21049505
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:10
- 大小:54.11KB
二叉树应用Word下载.docx
《二叉树应用Word下载.docx》由会员分享,可在线阅读,更多相关《二叉树应用Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
(6)解码:
将采用哈夫曼编码压缩的文本还原为英文文本。
3、实验步骤
(1)实现、建立以及生成哈夫曼树的代码已经给出;
(2)从终端输入一段英文文本,我是这样写的charstr[]="
"
;
printf("
请输入一段字符串:
\n"
);
scanf("
%s"
str);
但是运行之后显示下面的结果:
我想是不是因为空格把字符串分开了,就改成了下面这个:
charstr[30]="
printf("
for(i=0;
i<
30;
i++);
scanf("
%c"
&
str[i]);
但是这样字符串的长度就固定了,我想了想,没想出更好的办法来,只能这样了;
(3)压缩编码、统计原代码也已经给出;
(4)解码这一段比较难,花了很长时间才写出来(见程序清单);
(5)计算压缩比比较简单,就以下几句:
floatCompressRatio(charstr[],charhfmstr[])
{
float_str,hfm,com;
_str=strlen(str)*8.0;
hfm=strlen(hfmstr);
com=hfm/_str;
returncom;
}
以下是最后运行结果:
4、程序清单
#include<
stdio.h>
stdlib.h>
string.h>
limits.h>
#defineN96//ASCII字符集包含至多N个可见字符
typedefstruct
{chardata;
//字符值
intweight;
//权重
intlchild;
//左子结点
intrchild;
//右子结点
}huffnode;
//huffman节点类型
structcharcode
{intcount;
//字符出现的次数(频率)
charcode[N];
//字符的Huffman编码
}codeset[N];
//编码表,长为N,每项对应一个ascii码字符,下标i的项对应ascii编码为i+32的字符
huffnode*CreateHufftree(chardata[],intweight[],intn)
inti,k;
intmin1,min2,min_i1,min_i2;
huffnode*tree;
tree=(huffnode*)malloc((2*n-1)*sizeof(huffnode));
//为Huffman树分配n-1个节点空间
for(i=0;
2*n-1;
i++){//将各字符和其频率填入Huffman树,作为叶子结点
tree[i].lchild=tree[i].rchild=-1;
if(i<
n){
tree[i].data=data[i];
tree[i].weight=weight[i];
}
elsetree[i].data='
'
}
for(i=n;
i++)
{
min1=min2=INT_MAX;
min_i1=min_i2=-1;
for(k=0;
k<
i;
k++)
if(tree[k].weight>
=0)
if(tree[k].weight<
min1){
min2=min1;
min_i2=min_i1;
min1=tree[k].weight;
min_i1=k;
}
else
if(tree[k].weight<
min2){
min2=tree[k].weight;
min_i2=k;
}
tree[i].weight=min1+min2;
tree[min_i1].weight*=-1;
tree[min_i2].weight*=-1;
tree[i].lchild=min_i1;
tree[i].rchild=min_i2;
}
returntree;
voidCreateHuffcode(huffnodetree[],inti,chars[])
{chars1[N],c;
if(i!
=-1)
if(tree[i].lchild==-1&
&
tree[i].rchild==-1){
c=tree[i].data;
strcpy(codeset[c-32].code,s);
else{
strcpy(s1,s);
strcat(s1,"
0"
CreateHuffcode(tree,tree[i].lchild,s1);
1"
CreateHuffcode(tree,tree[i].rchild,s1);
return;
}
voidPrintHufftree(huffnodetree[],intn)
//输出tree中的Huffman树
inti;
Huffmantree:
i\tValue\tLchild\tRchild\tWeight\n"
for(i=2*n-2;
i>
=0;
i--)
%d\t"
i);
%c\t"
tree[i].data);
tree[i].lchild);
tree[i].rchild);
tree[i].weight);
voidEnCoding(charstr[],charhfmstr[])
//根据codeset编码表,逐个将str字符串中的字符转化为它的huffman编码,结果编码串放在hfmstr字符串中
inti,j;
hfmstr[0]='
\0'
i=0;
while(str[i]!
='
){
j=str[i]-32;
strcat(hfmstr,codeset[j].code);
i++;
voidDeCoding(huffnodetree[],intn,charhfmstr[],chardecodestr[])
{//对hfm_str字符串进行译码,放在decode_str字符串中
inti=0,j=0;
huffnoder;
r=tree[2*n-2];
while(hfmstr[i]!
)
while(r.lchild!
=-1&
r.rchild!
{
if(hfmstr[i]=='
0'
)
{
r=tree[r.lchild];
}
elseif(hfmstr[i]=='
1'
r=tree[r.rchild];
i++;
decodestr[j]=r.data;
j++;
r=tree[2*n-2];
floatCompressRatio(charstr[],charhfmstr[])//计算压缩比
returncom;
voidmain()
{
inti,j;
floatratio;
//压缩比
huffnode*ht;
//Huffman树
chardata[N];
//要编码的字符集合
intweight[N];
//字符集合中各字符的权重(频率)
intn=0;
//字符集合中字符的个数
charstr[30]="
//原始字符串
charhfm_str[1000]="
//编码后的字符串
chardecode_str[1000]="
//解码后的字符串
for(i=1;
i++)
for(i=0;
N;
i++){//初始化编码表,频率为,编码串为空串
codeset[i].count=0;
codeset[i].code[0]='
){//统计原始字符串中各字符出现的频率,存入编码表
codeset[j].count++;
//codeset[0]~[95]对应ascii码~127的字符
i++)//统计原始字符串中出现的字符个数
if(codeset[i].count!
=0)n++;
字符频率统计:
//显示统计结果
i++)
=0)printf("
%c:
%d,"
i+32,codeset[i].count);
j=0;
i++)//生成要编码的字符集合,以及权重
if(codeset[i].count!
=0){
data[j]=i+32;
weight[j]=codeset[i].count;
j++;
ht=CreateHufftree(data,weight,n);
//建立Huffman树,根节点是ht[2*n-2]
PrintHufftree(ht,n);
//显示Huffman树的存储结果
CreateHuffcode(ht,2*n-2,"
//以ht[2*n-2]为根,以空字符串为起始编码字符串,求出各叶子节点的编码字符串
//显示codeset中的Huffman编码,参见"
显示频率统计结果"
的代码.
EnCoding(str,hfm_str);
//对str字符串进行编码,放在hfm_str字符串中
编码序列:
%s\n"
hfm_str);
ratio=CompressRatio(str,hfm_str);
//计算压缩比
压缩比:
%3.2f\n"
ratio);
DeCoding(ht,n,hfm_str,decode_str);
//对hfm_str字符串进行译码,放在decode_str字符串中
解码后的字符串:
decode_str);
5、总结
通过这次实验,我对哈夫曼树有了更深刻的理解,学会了建立哈夫曼树、显示哈夫曼树、生成哈夫曼编码并译码还原成为原文本,实验过程中遇到的问题比较多,比如怎样译码,怎样计算压缩比,问了几个同学,也请教了老师,最后才真正弄明白。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 应用