哈夫曼树Word文档格式.docx
《哈夫曼树Word文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼树Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
四、实验目的:
1、掌握哈夫曼树的一般算法;
2、掌握用哈夫曼树对字符串进行编码;
3、掌握通过哈夫曼树对字符编码进行译码的过程。
五、实验内容:
1、对任意编码的字符串,统计字符频率和编码表;
2、通过编码表译得字符串。
六、程序代码:
#include<
iostream.h>
structelement//哈夫曼树结点类型
{intweight;
intlchild,rchild,parent;
};
structChar//字符编码表信息
{charnode;
intweight;
charcode[20];
voidSelect(elementhT[],int&
i1,int&
i2,intk)//在hT[]中查找最小值及次小值
{intmin1=9999,min2=9999;
i1=i2=0;
for(inti=0;
i<
k;
i++)
if(hT[i].parent==-1)
if(hT[i].weight<
min1)
{min2=min1;
i2=i1;
min1=hT[i].weight;
i1=i;
}
elseif(hT[i].weight<
min2)
{min2=hT[i].weight;
i2=i;
}
voidHuffmanTree(elementhuffTree[],Charzifuma[],intn)//构建哈夫曼树
{inti,k,i1,i2;
for(i=0;
2*n-1;
i++)//初始化
{huffTree[i].parent=-1;
huffTree[i].lchild=-1;
huffTree[i].rchild=-1;
}
n;
i++)//构造n棵只含有根结点的二叉树
huffTree[i].weight=zifuma[i].weight;
for(k=n;
k<
k++)//n-1次合并
{Select(huffTree,i1,i2,k);
//在huffTree中找权值最小的两个结点i1和i2
huffTree[i1].parent=k;
//将i1和i2合并,则i1和i2的双亲是k
huffTree[i2].parent=k;
huffTree[k].weight=huffTree[i1].weight+huffTree[i2].weight;
huffTree[k].lchild=i1;
huffTree[k].rchild=i2;
voidBianMa(elementhuffTree[],Charzifuma[],intn)//根据哈夫曼树编码
{inti,m,k,j,l;
chartemp[20];
if(n==1){zifuma[0].code[0]='
0'
;
zifuma[0].code[1]=0;
else{
for(i=0;
{j=0;
k=huffTree[i].parent;
l=i;
while(k!
=-1)
{if(huffTree[k].lchild==l)
temp[j++]='
elsetemp[j++]='
1'
l=k;
k=huffTree[k].parent;
k=j-1;
for(m=0;
m<
j;
m++)
zifuma[i].code[m]=temp[k--];
zifuma[i].code[m]=0;
}
voidBianMa2(Charzifuma[],charzifu[],charbianma[],intn)//根据编码表对字符串编码
{inti,j,k,m;
i=k=0;
while(zifu[i])
{for(j=0;
j<
j++)
if(zifu[i]==zifuma[j].node)
{m=0;
while(zifuma[j].code[m])
bianma[k++]=zifuma[j].code[m++];
i++;
bianma[k]=0;
voidYiMa(elementhuffTree[],Charzifuma[],charbianma[],charyima[],intn)//根据编号的码元译成字符串
{inti,j,k;
i=j=0;
if(n==1)
while(bianma[i++])
yima[j++]=zifuma[0].node;
else
{while(bianma[i])
{k=2*(n-1);
while(!
(huffTree[k].lchild==-1&
&
huffTree[k].rchild==-1))
if(bianma[i++]=='
)
k=huffTree[k].lchild;
else
k=huffTree[k].rchild;
yima[j++]=zifuma[k].node;
yima[j]=0;
voidSum(charzifu[],Charbianma[],int&
n)//计算字符串中字符种类的个数及其出现次数
{inti,j;
{for(intk=0;
k++)
if(bianma[k].node==zifu[i])
{bianma[k].weight++;
break;
}
if(k==j)
{
bianma[j].node=zifu[i];
bianma[j++].weight=1;
i++;
n=j;
voidmain()
{
intn,i;
chara[50],b[200],c[50];
elementhuffTree[100];
Charw[50];
cout<
<
"
请输入需要编码的字符串:
\n"
cin.getline(a,49);
Sum(a,w,n);
该字符串中共有"
n<
类字符。
其表示及出现频率分别为:
字符\t频率\n"
cout<
w[i].node<
'
\t'
w[i].weight<
\n'
HuffmanTree(huffTree,w,n);
该字符的编码表为:
BianMa(huffTree,w,n);
node\tweight\tcode\n"
{cout<
intj=0;
while(w[i].code[j])
cout<
w[i].code[j++];
BianMa2(w,a,b,n);
该字符串编码后为:
b<
endl;
YiMa(huffTree,w,b,c,n);
该字符串经编码后译码得:
c<
七、成果展示