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

C语言有关哈夫曼树的问题..救急呀!!!

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

我来回答

3个回答

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

#include "iostream"
#include "iomanip"
#include "string"
using namespace std;

#define MAX 256
typedef string *STR;

void InputData(string &s);
void DeCode();

typedef struct Huffnode {
unsigned weight; //权值 字符出现频率
bool in; // 是否加入Huffman树
int lchild,rchild;
void Set(unsigned &w,int lc=-1,int rc=-1,bool in = false ) {
weight = w;
lchild = lc;
rchild = rc;
in = in;
}
Huffnode() { weight=0; in = false;lchild=-1;rchild=-1;}
} *HuffTree;

void GetCode(HuffTree &nodes,int &k,STR &Code,string &str,int i,int leafNum,unsigned *Ind) {
if (k<leafNum) {
Code[Ind[k]] = str.substr (0,i);
return;
}
str[i] = '0';
GetCode(nodes,nodes[k].lchild ,Code,str,i+1,leafNum,Ind);
str[i] = '1';
GetCode(nodes,nodes[k].rchild ,Code,str,i+1,leafNum,Ind);
}

void GetMin(HuffTree &nodes,int n,int &min1,int &min2) { //得到两个最小节点下标
unsigned min;
for(int k=0;k<2;k++) {
min = 99999;
int t = 0;
for(int i=0;i<n;i++) {
if(nodes[i].in ) continue;
if(nodes[i].weight < min) {
min = nodes[i].weight;
t = i;
}
}
nodes[t].in = true;
if(k==0) min1 = t;
else min2 = t;
}
}

void MakeTree(HuffTree &Node,unsigned *Wei,int &Num) {
int i;
for(i=0;i<Num;i++) Node[i].Set(Wei[i]);
for(i=Num;i<2*Num-1;i++) {
int m1,m2;
GetMin(Node,i,m1,m2);
unsigned w = Node[m1].weight+Node[m2].weight ;
Node[i].Set(w,m1,m2);
}
}

void HaffmanCoding(string &In,STR &Code,int &N) {
unsigned Weight[MAX] = {0},Ind[MAX] = {0},Wei[MAX];
int i,Num = 0;
for(i=0;i<N;i++) Weight[(In[i]+256)%256]++;
for(i=0;i<MAX;i++) {
if (Weight[i]) {
Ind[Num] = i; //记录Everynode (0~Num-1)所存之字符代码
Wei[Num++] = Weight[i];
}
}
HuffTree Node = new Huffnode [2*Num-1];
MakeTree(Node,Wei,Num);
Code = new string[MAX];
string str; str.resize (MAX);
int nod = 2*Num-2;
GetCode(Node,nod,Code,str,0,Num,Ind);
cout<<endl<<"The Codes is:\n"<<endl;
cout<<"字符总数:"<<Num<<endl;
cout<<setw(10)<<"字符:"<<setw(10)<<"频度:"<<endl;
for(i=0;i<Num;i++) cout <<setw(10)<</*(char)*/Ind[i]<<setw(10)<<Wei[i]<<endl;
cout<<"\n码符:"<<endl;
for(i=0;i<N;i++) cout<<Code[(In[i]+256)%256];//<<" ";
cout<<endl<<endl;
}

void EnCode() {
string Input;
string *Code;
InputData(Input);
int N = Input.length ();
HaffmanCoding(Input,Code,N);
}

int main() {
cout<<"[1]--编码\n[2]--译码\n"<<endl;
if(cin.get ()=='1') {
EnCode();
}
else
DeCode();
cout<<endl;
return 1;
}

void InputData(string &s) {
cout<<"Please Input The Sources:\nPress 'A' & 'Enter' to Start:"<<endl;
char c;
while (cin.get ()!='A');
cin.get ();
cout<<"Start Input!!:"<<endl;
while ((c=cin.get())!='\n') s+=c;
}

//////////////////////////////////////////////////////////////////////

void DeCode() {
int num,i;
cout<<"输入出现的字符数:"<<endl;
cin>>num;
cout<<"输入每个字符对应的数字代码(0-255)及其频度:\n"
<<"格式: [代码][空格][频度]:\n"<<endl;
unsigned *Ind = new unsigned[num];
unsigned *Wei = new unsigned[num];
for(i=0;i<num;i++) cin>>Ind[i]>>Wei[i];
HuffTree Node = new Huffnode [2*num-1];
MakeTree(Node,Wei,num);
cout<<"Input The Code You Want to DeCode:"<<endl;
cout<<"Please Input The Code You Want to DeCode:\nPress 'A' & 'Enter' to Start:"<<endl;
while (cin.get ()!='A');
cin.get ();
cout<<"Start Input!!:"<<endl;
char c;
int k=2*num-2;
string Out;
while ((c=cin.get ())!='.') {
if(k<num) {
char s = (char)Ind[k];
Out += s;
k=2*num-2;
}
if(c=='0') k = Node[k].lchild ;
else if(c=='1') k = Node[k].rchild ;
}
cout<<"解码结果:\n"<<endl;
cout<<Out;
cout<<endl;
}

//////////////////////////////////////////
用VC6.0编译,程序运行时会提示你怎么输入的

刚开始选择编码还是译码,用1和2区分。
选择1后,编码...按要求输入你要编码的字符串就行了,可以输入任意字符,包括汉字和特殊符号。
选择2后,译码... 将上一部编码的结果现保存起来,再按要求输入程序提示的内容即可。
////////////////////////////////////////////////
下面是例子:
////-----------------
[1]--编码
[2]--译码

1
Please Input The Sources:
Press 'A' & 'Enter' to Start:
A [输入A和回车]
Start Input!!:
Hello,你是谁? [要编码的内容]
[编码结果:]
The Codes is:

字符总数:13
字符: 频度:
44 1
72 1
101 1
108 2
111 1
163 1
173 1
191 1
196 1
199 1
202 1
203 1
227 1

码符:
0111100001001010010110110100111111110000101110101100
//-------------
[1]--编码
[2]--译码

2
输入出现的字符数:
13 [上一步编码时出现的字符总数,编码结束后有提示]
输入每个字符对应的数字代码(0-255)及其频度:
格式: [代码][空格][频度]:
[编码结束后的提示,copy过来即可]
44 1
72 1
101 1
108 2
111 1
163 1
173 1
191 1
196 1
199 1
202 1
203 1
227 1
Input The Code You Want to DeCode:
Please Input The Code You Want to DeCode:
Press 'A' & 'Enter' to Start:
A
Start Input!!: [开始输入码字]
0111100001001010010110110100111111110000101110101100
. [输入小数点[.]结束]
解码结果:

Hello,你是谁?

Press any key to continue [程序结束]
///////////////////////////////////////////
其实真正应用的时候可以将出现的字符数及其频度都保存在编码后的文件中,直接读取文件,就能解码了!!!!!!!!!

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

这个不难
代码342行
使用了一个最小堆 把字母的权重赋好值之后 插入到最小堆里 每次从堆里取出两个权重最小的元素 然后把这两个元素组成一个新的树 树根结点权重等于两个子结点权重之后 然后把这棵树再插入到最小堆中 循环做到只剩一棵树后 该树就为霍夫曼树 先根输出 使用一个递归操作就可完成
楼主加油哈!

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

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