优先级队列实现哈夫曼树的编码和译码
//优先级队列实现的哈夫曼树的编码和译码 #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; }
作者:阿凡卢
出处:https://www.cnblogs.com/luxiaoxun/archive/2012/08/04/2622626.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App