问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求一个建立哈夫曼树的c/c++程序算法

发布网友 发布时间:2022-05-26 16:41

我来回答

1个回答

热心网友 时间:2023-10-28 19:43

//本程序根据26个英文字母出现的频度,得到了它们的一种哈夫曼编码方案
//by jirgal 2005.4.18
#include<iostream.h>
#include<iomanip.h>
#define NUM 26 //字母数
#define TNUM 51 //
#define LTH 15 //编码最大长度

class Node
{
public:
char data;
int weight;
int parent;
int lchild;
int rchild;
};

void main()
{
char ch[NUM]={'a','b','c','d','e','f','g','h','i','j','k','l',
'm','n','o','p','q','r','s','t','u','v','w','x','y','z'};//26个字母

int weit[NUM]={856,139,279,378,1304,289,199,528,627,13,42,
339,249,707,797,199,12,677,607,1045,249,92,149,17,199,8};//出现频率

Node nodes[TNUM]; //用对象数组存储哈夫曼树

int i,j,one,two,a,b;
int hc[NUM][LTH]; //用于存储编码
int m,n;

//初始化数组
for(i=0;i<NUM;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<TNUM;i++)
{
nodes[i].data='@';
nodes[i].weight=-1;
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}

//建立哈夫曼树
for(i=NUM;i<TNUM;i++)
{
a=b=-1;
one=two=10000; //最大权数
for(j=0;j<i;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<LTH;i++)
{
for(j=0;j<NUM;j++)
{
hc[j][i]=7;
}
}

//编码
for(i=0;i<NUM;i++)
{
j=LTH-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;
}
else
{
hc[i][j]=1;
}
j--;
}

}

//输出 nodes
cout<<"HuffmanTree:"<<endl;
cout<<setw(4)<<"NO."<<setw(6)<<"data"<<setw(8)<<"weight"<<setw(6)
<<"parnt"<<setw(6)<<"lchd"<<setw(6)<<"rchd"<<endl;
for(i=0;i<TNUM;i++)
{
cout<<setw(4)<<i<<setw(6)<<nodes[i].data<<setw(8)<<nodes[i].weight<<setw(6)
<<nodes[i].parent<<setw(6)<<nodes[i].lchild<<setw(6)<<nodes[i].rchild<<endl;
}

//输出编码
cout<<endl<<"Result:"<<endl;
cout<<setw(6)<<"char"<<setw(10)<<"frequency"<<setw(16)<<"huffmancode\n";
for(i=0;i<NUM;i++)
{
cout<<setw(6)<<ch[i]<<setw(8)<<weit[i];
cout<<" ";
for(j=0;j<LTH;j++)
{
if(hc[i][j]!=7)
{
cout<<hc[i][j];
}
}
cout<<endl;
}
cout<<"\nDone.\n"<<endl;
}

zz from http://zhidao.baidu.com/question/871786.html?si=3
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我的配置可以玩使命召唤9吗 电脑型号 惠普 HP Pavilion G4 NoteB... 雅马哈机油好还是新大州机油好 豪爵和新大洲哪个的机油好? 工程资质加盟有哪些常见的骗局? 中国是否会出现像日本"三菱,三井,住友"那样的大财团? 中国会实现日本采用的教育制度吗? ...日本经济的手段来对付中国,中国经济会不会像日本那样垮掉? 联想笔记本一直滴滴滴响 联想笔记本怎么一直滴 女朋友太多愁善感了觉得我肤浅不懂她 我摸了一下刚认识不久的女朋友的头,她觉得我很肤浅,怎样道欠?_百度知 ... 悬赏50!关于Huffman编码树!在线等! 眉毛不长了 眉毛末梢不长了。 C语言有关哈夫曼树的问题..救急呀!!! 男生眉毛少?怎么能变得浓密点?前面还行。后面少点 没有眉毛该怎么办】、 前不搭眉,鬓不过腮,是什么意思? 我的眉毛前半段有 后半段就比较稀少 怎样让后面的眉毛长出来? 最近发现右眉毛前面有一竖条不长眉毛了,一直线的眉毛就像被隔开了,各位这是怎么回事呀? 鹅蛋和什么不能一起吃 远程控制电脑提示你的伙伴id未连接网络怎么回事 如果丰臣秀吉统一日本后不打朝鲜,去打菲律宾和印尼会怎么样 二战后的德国占领荷兰后在日本攻占东南亚前荷兰殖民地印尼是什么状态? 现代科幻小说文中有攻占印尼 中国都侵略过哪些国家? 什么时候打印尼? 如果没有1292年元朝攻打爪哇的史实,印尼历史将如何发展? 男主重生,开网络公司,重生前是个很厉害的黑客,重生后在网络上攻打印尼。 侠盗猎车4罪恶都市中的武装直升机的密码是什么? 如果中国和印尼打,中国能胜吗 我的眉毛前年的时候碰了一下,当时没缝针,现在有一个坑,而且不长眉 头发前不过眉是什么意思? 是刘海超过眉毛还是不超过眉毛 眉毛比较淡还不长,有哪些办法啊? 如何让长头发前不过眉 win7电脑密码忘记了,怎么使用一键还原 求C++编码的哈夫曼树,要求26字母和空格,逗号句号的 电脑win7系统登陆管理员密码忘了,可以用一键还原解除密码吗? win7开机密码忘了怎么办,开机时一键还原能解决吗?还原后其他东西会 win7电脑忘记登陆密码一键还原行么? 台式电脑win7 个人忘记开机密码怎么样才能开启电脑 一键恢复除外 win7一键还原可以重置开机密码吗?在线等、急!! win7电脑一键还原后,忘记账户和密码,单子也找不到了,身份证也忘了,怎么办!急急急!!! 做完形填空和阅读理解的方法 典型的付费网络营销方法是什么? 请问花钱的网络营销手段都有哪些? 求阅读理解,完形填空做题技巧 怎样做好完形填空和阅读理解 山西运城附近的自然风景区有哪些? 山西,运城有什么好玩的景区?拜托了各位 谢谢 离运城市最近的5A景点