哈夫曼编码树的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
- c 实现哈夫曼编码
- C 实现 哈夫曼编码
- 哈夫曼编码的C语言实现
- 哈夫曼编码的C语言实现
- C语言哈夫曼编码的实现
- 哈夫曼编码的C语言实现
- c语言实现哈夫曼编码
- c语言实现哈夫曼编码
- C语言实现哈夫曼编码
- 哈夫曼编码(C实现)
- C语言实现哈夫曼编码
- C语言实现哈夫曼编码
- 哈夫曼编码C语言实现
- C语言哈夫曼树和哈夫曼编码的实现
- C++Huffman树的构造实现及编码译码过程
- 哈夫曼编码的实现
- 哈夫曼编码的实现
- base64编码解码的实现(C语言)
- RxJava 和 Spring MVC (译)
- IOS UIlabel自适应Fram后顶部出现灰色横线
- 教你理解复杂的C-C++声明
- Android数据存储和访问-登录记住密码功能
- Android事件分发机制完全解析,带你从源码的角度彻底理解
- 哈夫曼编码树的C++实现
- jquery.seat-chartsMark在线选座插件使用
- java 初探(四)
- 用指针参数去申请内存
- js实现对Android设备物理返回键单击/双击事件处理(Framework7框架)
- PhotoView监听坐标校准
- 自定义注解之编译时注解(RetentionPolicy.CLASS)(二)——JavaPoet
- 解析JSON数组
- matlab BP 神经网络 归一化的理解