哈夫曼编码树的C++实现

来源:互联网 发布:小七网络毛毯中学 编辑:程序博客网 时间:2024/06/05 05:16

哈夫曼编码,参考与《算法导论》

//huffman_another solution#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;struct HuffNode{char key;//关键字int freq;//出现de频率,即权重HuffNode* left;HuffNode* right;string code;//编码以字符串形式表示HuffNode(int fs,int val){freq=fs; left=right=NULL;code="";key='a'+val;}HuffNode(){freq=0; left=right=NULL;code="";key='0';}};bool isgreater(HuffNode* a,HuffNode* b){return a->freq>b->freq;}const int N=6;const int freq[N]={45,13,12,16,9,5};void build_HuffNode(vector<HuffNode*>& C,const int freq[],int n){int i,j;for(i=0;i<n;i++)C.push_back(new HuffNode(freq[i],i));for(i=0;i<n-1;i++)//non-leaves node{HuffNode* z=new HuffNode();sort(C.begin(),C.end(),isgreater);int nc=C.size();HuffNode* x=C[nc-1],*y=C[nc-2];C.pop_back();z->left=x;C.pop_back();z->right=y;z->freq=x->freq+y->freq;C.push_back(z);//cout<<z->freq<<endl;}}void pre_order(HuffNode* root,string & s){if(!root)return;if(!root->left&&!root->right)cout<<root->key<<":"<<root->code<<":"<<root->freq<<'\t';//输出叶子节点if(root->left){  root->left->code=root->code+"0"; //左孩子加0  pre_order(root->left,s);}if(root->right){       root->right->code=root->code+"1"; //右孩子加1pre_order(root->right,s);}}int main(){vector<HuffNode*> C;build_HuffNode(C,freq,N);//cout<<C.size()<<endl;    string s;pre_order(C[0],s);}
所用例子如下:

运行结果:



0 0
原创粉丝点击