哈夫曼树编码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);