哈夫曼树Word文档格式.docx

上传人:b****1 文档编号:15295895 上传时间:2022-10-29 格式:DOCX 页数:7 大小:82.39KB
下载 相关 举报
哈夫曼树Word文档格式.docx_第1页
第1页 / 共7页
哈夫曼树Word文档格式.docx_第2页
第2页 / 共7页
哈夫曼树Word文档格式.docx_第3页
第3页 / 共7页
哈夫曼树Word文档格式.docx_第4页
第4页 / 共7页
哈夫曼树Word文档格式.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

哈夫曼树Word文档格式.docx

《哈夫曼树Word文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼树Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。

哈夫曼树Word文档格式.docx

四、实验目的:

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<

七、成果展示

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

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1