哈夫曼树编码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈夫曼树编码/译码系统

【实验内容及要求】

(1) 从终端读入字符集大小为n(即字符的个数),逐一输入n个字符和相应的n个权值(即字符出现的频度),建立哈夫曼树,将它存于文件hfmtree 中。并将建立好的哈夫曼树以树或凹入法形式输出;对每个字符进行编码并且输出。

(2) 利用已建好的哈夫曼编码文件hfmtree ,对键盘输入的正文进行译码。输出字符正文,再输出该文的二进制码。

#include

#include

#include

#include

#define num 27 //字母数

#define nod 51 //总的树结点的个数

#define len 15 //编码最大长度

class Node {

public:

char data;

int weight;

int parent;

int lchild;

int rchild;

};

int main() {

ofstream out("test6.txt");

char ch[27];

for(int nn=0;nn<27;nn++)

{

ch[nn]=65+nn;

out<

}

ch[26]=' ';

int weit[num]={64,13,22,32,103,21,15,47,57,1,5,

32,20,57,63,15,1,48,51,80,23,8,18,1,16,1,168};//频率

Node nodes[nod]; //哈夫曼树

int i,j,one,two,a,b;

int static hc[num][len]; //用于存储编码

int m,n;

//初始化数组

for(i=0;i

{

nodes[i].data=ch[i];

nodes[i].weight=weit[i];

nodes[i].parent=-1;

nodes[i].lchild=-1;

nodes[i].rchild=-1;

}

for(i=num;i

{

nodes[i].data='@';

nodes[i].weight=-1;

nodes[i].parent=-1;

nodes[i].lchild=-1;

nodes[i].rchild=-1;

}

//建立哈夫曼树

for(i=num;i

{

a=b=-1;

one=two=1000; //最大权数

for(j=0;j

{

if(nodes[j].parent==-1)

{

if(nodes[j].weight<=two)

{

one=two;

two=nodes[j].weight;

a=b;

b=j;

}

else if(nodes[j].weight>two&&nodes[j].weight<=one) {

one=nodes[j].weight;

a=j;

}

}

}//for语句得到parent=-1(即没父结点)且weight最小的两个结点nodes[a].parent=i;

nodes[b].parent=i;

nodes[i].lchild=a;

nodes[i].rchild=b;

nodes[i].weight=nodes[a].weight+nodes[b].weight;

}

//初始化hc

for(i=0;i

for(j=0;j

hc[j][i]=7;

//编码

for(i=0;i

{

j=len-1;

for(m=i,n=nodes[i].parent;m!=-1;m=n,n=nodes[n].parent)

{

if(nodes[n].lchild==m)

{

hc[i][j]=0;

}

if(nodes[n].rchild==m)

{

hc[i][j]=1;

}

j--;

}

}

out<

for(i=0;i

{

out<

out<<" ";

for(j=0;j

{

if(hc[i][j]!=7)

{

out<

}

}

out<

}

char ch2[100];

cout<<"请输入所要进行译码的字符串:"<

cin.getline(ch2,100);

相关文档
最新文档