//优先级队列实现的哈夫曼树的编码和译码   

#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

优先级队列实现哈夫曼树的编码和译码相关推荐

  1. 基于最小优先级队列构造哈夫曼树 Java

    哈夫曼编码是一种前缀编码,也就是说,它编码的字符,任何一个字符的编码都不是另一个字符的前缀,这使得对哈夫曼编码进行解码变得容易.而使得哈夫曼编码是前缀编码的关键就是哈夫曼树.哈夫曼树也正是本文要说的. ...

  2. c语言赫夫曼树的编码与译码,哈夫曼树与编码译码实现

    一.哈弗曼树的基本概念. 哈夫曼树,又称最优树,是一类带权路径长度最短的树.下面有几个概念: (1)路径. 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. (2)路径长度. 路径上的分枝 ...

  3. 让人头疼的哈夫曼树与编码

    哈夫曼树(Huffman Tree): 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树.哈夫曼树是带权路径长度最短的树,权值较大 ...

  4. 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, ...

  5. 哈夫曼树:HDU5884-Sort(队列、哈夫曼树)

    Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) 题目链接:http://ac ...

  6. 【数据结构】赫夫曼树与编码

    赫夫曼树与赫夫曼编码 前言 赫夫曼树 存储结构 初始化树 构建树 赫夫曼编码 初始化编码 构建编码 前言 (概念) 路径:从一个节点到另一个节点的分支 路径长度:从一个节点到另一个节点的分支总数 节点 ...

  7. 数据结构(六)霍夫曼树与编码

    1.算法流程 (1)构建霍夫曼树:自底向上 根据统计频率构建霍夫曼树: A.把所有的节点扔进排序队列queue中: B.从queue选择选择前面两个最小的元素a.b,把最小的树a作为左节点,把最小的b ...

  8. 贪婪算法在解决哈夫曼树及编码问题中的应用

    哈夫曼编码,是一种可变字长编码(VLC)的高效算法.该算法是Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码. 相比定长编码来 ...

  9. java哈夫曼树编码_哈夫曼树的编码实验

    Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 建树,造树,编码,解码 一.哈夫曼树编码介绍 1.哈夫曼树: (1)定义:假设有n个权值{w1, w2, ..., wn},试构造一棵含有n个叶子 ...

最新文章

  1. 常用的20个正则表达式
  2. linux可平通网关但不能上网,redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网...
  3. Qt文档阅读笔记-QLibrary基本概念及实例
  4. iis端口号 linux,Linux 6 修改ssh默认远程端口号的操作步骤
  5. Jmeter命令行执行并生成HTML报告
  6. Android系统自带AEC/AGC/NC的demo
  7. 《 Python笔记》— 将pyinstalller打包封装的exe文件反编译为pyc文件和python文件
  8. 500强企业常用的高效工作方法
  9. 搭建-ico图标制作
  10. Unitek的USB3.0 TF卡读卡器
  11. 生命倒计时-倒数9116日
  12. 设置360浏览器的背景为护眼模式(浅豆绿色)
  13. 互联网做手机没戏,恐只能靠维修赚钱
  14. 一起talk C栗子吧(第一百九十三回:C语言实例--DIY less命令二 )
  15. Python: self的含义
  16. python机器语言直接用二进制代码表达指令_尔雅慕课搜题app,超星尔雅考试搜题,超星慕课查题app,学堂云搜题...
  17. 近世代数 笔记与题型连载 第十一章(正规子群与商群)
  18. 阿里云盘——多电脑实时同步文件的实现
  19. (Tekla Structures二次开发)如何获取一个与已知向量垂直的向量
  20. steam平台,分手厨房2如何实现键盘+手柄,双人游戏

热门文章

  1. 2022-2028年中国聚硫橡胶行业市场研究及前瞻分析报告
  2. SpringBoot2.3 修改响应头、添加更新token、解决在过滤器中修改失败
  3. 【Sql Server】DateBase-SQL调整
  4. 计算机组成原理中的“上溢”和“下溢”分别的定义是什么?
  5. OpenMP用法大全
  6. __new__ __init__区别
  7. 北汽蓝谷极狐阿尔法S与T
  8. 3D MinkowskiEngine稀疏模式重建
  9. 色彩(颜色)空间原理(中)
  10. 2021年大数据ZooKeeper(六):ZooKeeper选举机制