优先级队列实现哈夫曼树的编码和译码
//优先级队列实现的哈夫曼树的编码和译码 #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
优先级队列实现哈夫曼树的编码和译码相关推荐
- 基于最小优先级队列构造哈夫曼树 Java
哈夫曼编码是一种前缀编码,也就是说,它编码的字符,任何一个字符的编码都不是另一个字符的前缀,这使得对哈夫曼编码进行解码变得容易.而使得哈夫曼编码是前缀编码的关键就是哈夫曼树.哈夫曼树也正是本文要说的. ...
- c语言赫夫曼树的编码与译码,哈夫曼树与编码译码实现
一.哈弗曼树的基本概念. 哈夫曼树,又称最优树,是一类带权路径长度最短的树.下面有几个概念: (1)路径. 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. (2)路径长度. 路径上的分枝 ...
- 让人头疼的哈夫曼树与编码
哈夫曼树(Huffman Tree): 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树.哈夫曼树是带权路径长度最短的树,权值较大 ...
- 20172305 2018-2019-1 蓝墨云班课实验--哈夫曼树的编码
20172305 2018-2019-1 蓝墨云班课实验--哈夫曼树的编码 实验要求 设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x, ...
- 哈夫曼树:HDU5884-Sort(队列、哈夫曼树)
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) 题目链接:http://ac ...
- 【数据结构】赫夫曼树与编码
赫夫曼树与赫夫曼编码 前言 赫夫曼树 存储结构 初始化树 构建树 赫夫曼编码 初始化编码 构建编码 前言 (概念) 路径:从一个节点到另一个节点的分支 路径长度:从一个节点到另一个节点的分支总数 节点 ...
- 数据结构(六)霍夫曼树与编码
1.算法流程 (1)构建霍夫曼树:自底向上 根据统计频率构建霍夫曼树: A.把所有的节点扔进排序队列queue中: B.从queue选择选择前面两个最小的元素a.b,把最小的树a作为左节点,把最小的b ...
- 贪婪算法在解决哈夫曼树及编码问题中的应用
哈夫曼编码,是一种可变字长编码(VLC)的高效算法.该算法是Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码. 相比定长编码来 ...
- java哈夫曼树编码_哈夫曼树的编码实验
Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 建树,造树,编码,解码 一.哈夫曼树编码介绍 1.哈夫曼树: (1)定义:假设有n个权值{w1, w2, ..., wn},试构造一棵含有n个叶子 ...
最新文章
- 常用的20个正则表达式
- linux可平通网关但不能上网,redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网...
- Qt文档阅读笔记-QLibrary基本概念及实例
- iis端口号 linux,Linux 6 修改ssh默认远程端口号的操作步骤
- Jmeter命令行执行并生成HTML报告
- Android系统自带AEC/AGC/NC的demo
- 《 Python笔记》— 将pyinstalller打包封装的exe文件反编译为pyc文件和python文件
- 500强企业常用的高效工作方法
- 搭建-ico图标制作
- Unitek的USB3.0 TF卡读卡器
- 生命倒计时-倒数9116日
- 设置360浏览器的背景为护眼模式(浅豆绿色)
- 互联网做手机没戏,恐只能靠维修赚钱
- 一起talk C栗子吧(第一百九十三回:C语言实例--DIY less命令二 )
- Python: self的含义
- python机器语言直接用二进制代码表达指令_尔雅慕课搜题app,超星尔雅考试搜题,超星慕课查题app,学堂云搜题...
- 近世代数 笔记与题型连载 第十一章(正规子群与商群)
- 阿里云盘——多电脑实时同步文件的实现
- (Tekla Structures二次开发)如何获取一个与已知向量垂直的向量
- steam平台,分手厨房2如何实现键盘+手柄,双人游戏
热门文章
- 2022-2028年中国聚硫橡胶行业市场研究及前瞻分析报告
- SpringBoot2.3 修改响应头、添加更新token、解决在过滤器中修改失败
- 【Sql Server】DateBase-SQL调整
- 计算机组成原理中的“上溢”和“下溢”分别的定义是什么?
- OpenMP用法大全
- __new__ __init__区别
- 北汽蓝谷极狐阿尔法S与T
- 3D MinkowskiEngine稀疏模式重建
- 色彩(颜色)空间原理(中)
- 2021年大数据ZooKeeper(六):ZooKeeper选举机制