二叉树的应用实验报告Word文档下载推荐.docx
- 文档编号:20430012
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:9
- 大小:50.20KB
二叉树的应用实验报告Word文档下载推荐.docx
《二叉树的应用实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《二叉树的应用实验报告Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
6)解码:
将采用哈夫曼编码压缩的文本还原为英文文本。
3.算法说明:
1)二叉树和哈夫曼树的相关算法见讲义。
2)编码的方法是:
从头开始逐个读取文本字符串中的每个字符,查编码表得到它的编码并输出。
重复处理直至文本结束。
3)解码的方法是:
将指针指向哈夫曼树的树根,从头开始逐
个读取编码序列中的每位,若该位为1则向右子树走,为0贝y向左子树走。
当走到叶子节点时,取出节点中的字符并输出。
重新将指针放到树根,继续以上过程直至编码序列处理完毕。
4)压缩比例的计算:
编码后的文本长度为编码序列中的0和
1,的个数,原文本长度为字符数*8。
两者之比即为压缩比。
4.实验步骤:
实现哈夫曼树的编码序列操作:
inti=0,j=0;
huffnodep;
p=tree[2*n-2];
〃序号2*n-2节点就是树根节点while(hfmstr[i]!
='
\0'
)〃从头开始扫描每个字符,直到结
束
if(hfmstr[i]=='
0'
)〃
{
p=tree[p.lchild];
〃
}
elseif(hfmstr[i]=='
1'
p=tree[p.rchild];
{while(p.lchild!
=-1&
&
p.rchild!
=-1)
为0则向左子树走
取出叶子节点中的字符
为1则向右子树走
i++;
decodestr[j]=p.data;
j++;
〃对字符进行译码,结果放在
decodestr字符串中
〃返回根节点
程序修改后完整源代码如下:
#include<
stdio.h>
stdlib.h>
string.h>
limits.h>
〃专门用于检测整型数据数据类型的
表达值围
#defineN96//ASCII字符集包含至多N个可见字符
typedefstruct//Huffman树节点定义
{chardata;
//字符值
intweight;
//权重
intlchild;
//左子结点
intrchild;
//右子结点
}huffnode;
//huffman节点类型
structcharcode
{intcount;
//字符出现的次数(频率)
charcode[N];
//字符的Huffman编码
}codeset[N];
//编码表,长为N,每项对应一个ascii码字
符,下标i的项对应ascii编码为i+32的字符
huffnode*CreateHufftree(chardata[],intweight[],
intn)//建立Huffman树的算法
inti,k;
intmin1,min2,min_i1,min_i2;
huffnode*tree;
tree=(huffnode*)malloc((2*n-1)*sizeof(huffnode));
//为Huffman树分配2n-1个节点空间
for(i=0;
i<
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++)////合并两棵树,作n-1遍
min仁min2=INT_MAX;
〃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」2=min」1;
min1=tree[k].weight;
min_i1=k;
else
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;
inti,char
求该节点下所有叶
voidCreateHuffcode(huffnodetree[],s[])〃已知tree[i]节点的编码序列为s,子节点的编码序列。
{chars1[N],c;
if(i!
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;
printf("
Huffmantree:
\n"
printf("
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]='
〃把hfmstr串赋空
i=0;
while(str[i]!
\O'
)〃从第头开始扫描str的每个字符,
直到该字符的结束
j=str[i]-32;
〃执行字符到huffman的转换
strcat(hfmstr,codeset[j].code);
〃把codest编码串添
加到hfmstr结尾处
i++;
〃每次循环完i的值加1
voidDeCoding(huffnodetree[],intn,charhfmstr[],
chardecodestr[])
//根据tree数组中的huffman树,逐个对hfmstr字符串中
的字符进行译码,结果放在decodestr字符串中
〃序号2*n-2节点就是树根节点
while(hfmstr[i]!
=-1)〃指针为空,儿子的
值取完了
O'
)〃为0则向左子树走
〃取出叶子节点中的字符
)〃为1则向右子树走
voidmain()
inti,j;
huffnode*ht;
//Huffman树
chardata[N];
//要编码的字符集合
intweight[N];
//字符集合中各字符的权重(频率)
intn=0;
//字符集合中字符的个数
charstr[1OOO];
//需输入的原始字符串
charhfm_str[1000]="
"
//编码后的字符串
chardecode_str[1000]="
〃解码后的字符串
printf(”请输入要转换的字符串\n"
gets(str);
for(i=0;
N;
i++){//初始化编码表,频率为0,编码串为空
串
codeset[i].count=0;
codeset[i].code[0]='
if(codeset[i].count!
=0)n++;
字符频率统计:
//显示统计结果
i++)codeset[i].count);
j=0;
i++)//生成要编码的字符集合,以及权重
if(codeset[i].count!
=0){
data[j]=i+32;
weight[j]=codeset[i].count;
}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编码,参见”显示频率统计结果
的代码.
haffman编码为:
i++){
=0)
%c:
%s\n"
i+32,codeset[i].code);
EnCoding(str,hfm_str);
//对str字符串进行编码,放在
hfm_str字符串
编码序列:
hfm_str);
DeCoding(ht,n,hfm_str,decode_str);
//对hfm_str字
符串进行译码,放在decode_str字符串中
printf(”解码后的字符串:
decode_str);
free(ht);
//释放Huffman树
实验总结:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 应用 实验 报告