优先级队列实现哈夫曼树的编码和译码
2012-04-06 19:42
721 查看
//优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using namespace std; class Node { public: float weight; Node* left; Node* right; char ch; Node(float w,Node* l=NULL,Node* r=NULL,char c=' '):weight(w),ch(c),left(l),right(r) {} Node(float w,char c=' '):weight(w),ch(c),left(NULL),right(NULL) {} }; class cmp { public : bool operator()(Node* a,Node* b) { return a->weight>b->weight; } }; vector<int> v; void Encode(Node* r)//打印字符的编码 { if(r->left==NULL && r->right==NULL) { cout << r->ch <<": "; for (int i = 0;i<v.size();++i) cout << v[i]; cout << endl; v.pop_back(); return ; } if(r->left) { v.push_back(0); Encode(r->left); } if(r->right) { v.push_back(1); Encode(r->right); } if(!v.empty()) { v.pop_back(); } } void Decode(Node* root, string s)//译码 { Node* p=root; for(int i=0;i<s.length();++i) { if(s[i]=='0') { if(p->left) p=p->left; else { cout<<s<<" Can't decode!"<<endl; return ; } } if(s[i]=='1') { if(p->right) p=p->right; else { cout<<s<<" Can't decode!"<<endl; return ; } } } cout<<s<<": "<<p->ch<<endl; } void freeTree(Node* p)//销毁哈夫曼树 { if(p->left!=NULL) freeTree(p->left); if(p->right!=NULL) freeTree(p->right); delete p; p=NULL; } int main() { Node* m1,*m2; char ch[]={'A','C','E','D','F','G'};//字符 float f[]={0.1,0.3,0.4,0.5,0.2,0.6};//频率 priority_queue<Node*,vector<Node*>,cmp> q; int n=sizeof(ch)/sizeof(ch[0]); for(int i=0;i<n;++i) { q.push(new Node(f[i],ch[i])); cout<<ch[i]<<": "<<f[i]<<'\t'; } cout<<endl; for(int i=1;i<n;++i) { m1=q.top(); q.pop(); m2=q.top(); q.pop(); float w=m1->weight+m2->weight; q.push(new Node(w,m1,m2)); } Node* root=q.top(); Encode(root); cout<<endl; Decode(root,"1011"); freeTree(root); return 0; }
相关文章推荐
- 优先级队列实现哈夫曼树的编码和译码
- 【数据结构】哈夫曼树实现编码译码
- 哈夫曼树构建,编码,译码的实现------数据结构
- 解析C++哈夫曼树编码和译码的实现
- C++哈夫曼树编码和译码的实现
- 用redis实现支持优先级的消息队列
- 基于最小优先级队列构造哈夫曼树 Java
- 《算法导论》第六章----优先级队列(代码实现+部分练习)
- 用数组实现 优先级队列
- 哈夫曼树编码与译码
- 一般队列和循环队列及优先级队列的实现
- java使用数组实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 哈夫曼树及编码简介和实现
- POJ 3253 Fence Repair 题解(优先队列实现哈夫曼树)
- [PY3]——实现一个优先级队列
- 优先级队列(哈夫曼树)poj3253
- 泛型优先级队列的实现
- 【数据结构】优先级队列的实现(适配器模式)
- 哈夫曼树的编码和译码