Huffman编码是之前一道算法作业题,最近又要复习考试了,先把这个的代码再看一下吧。

算法原理很简单,使用优先队列将两个节点弹出,然后合并节点之后再入队列如此循环做下去即可。

主要问题在于树的修改问题,出队的树进行修改,然后将其合并成为一个新的树,在弹出的时候,树的两个节点地址已定,但是由于循环这两个地址会进行修改,所以单独写了一个函数用来进行树的复制。

 #include<iostream>
#include<algorithm>
#include<vector>
#include<string.h>
#include<queue>
using namespace std;
typedef struct tree{
struct tree *left;
struct tree *right;
int data;
}Tree; struct cmp
{
bool operator()(const Tree &t1,const Tree &t2)
{
return t1.data>t2.data;
}
};
int a[]={,,,,,,,};//乱序
int code[]={};
int m=;
void printhuffman(Tree *huffman)
{
if(huffman->left!=NULL)
{
code[m]=;m++;
printhuffman(huffman->left);
m--;
}
if(huffman->right!=NULL)
{
code[m]=;m++;
printhuffman(huffman->right);
m--;
}
if(huffman->left==NULL&&huffman->right==NULL)
{
printf("The code of frequency is %3d :",huffman->data);
for(int i=;i<m;i++)
printf("%d ",code[i]);
printf("\n");
return ;
}
}
void copytree(Tree **a,Tree *b)
{
*a=new Tree();
if(b->left==NULL&&b->right==NULL)
{
(*a)->left=NULL;(*a)->right=NULL;
(*a)->data=b->data;
return;
}
if(b->left!=NULL)
{
(*a)->left=b->left;
copytree(&((*a)->left),b->left);
}
(*a)->data=b->data;
if(b->right!=NULL)
{
(*a)->right=b->right;
copytree(&((*a)->right),b->right);
} }
int main()
{
int n=;
priority_queue<Tree,vector<Tree>,cmp> minnode;
Tree huffman; for(int i=;i<n;i++)
{
Tree *newtree=new Tree();
newtree->data=a[i];
newtree->left=NULL;
newtree->right=NULL;
minnode.push(*newtree);
}
while(minnode.size()>=)
{
Tree temp1=minnode.top();minnode.pop();
Tree temp2=minnode.top();minnode.pop();
Tree *temp3=new Tree();
temp3->left=NULL;
temp3->right=NULL;
temp3->data=;
copytree(&temp3->left,&temp1);
copytree(&temp3->right,&temp2);
temp3->data=(*(temp3->left)).data+(*(temp3->right)).data;
minnode.push(*temp3);
}
huffman=minnode.top();
printhuffman(&huffman);
return ;
}

运行结果:

Huffman树编码-优先队列实现的更多相关文章

  1. 【Huffman树贪心+优先队列】POJ3253-Fence Repair

    思路详见之前的贪心专题,用优先队列来代替之前的插入排序,效率为O(nlogn) #include<iostream> #include<cstdio> #include< ...

  2. poj 3253 Fence Repair(优先队列+huffman树)

    一个很长的英文背景,其他不说了,就是告诉你锯一个长度为多少的木板就要花多少的零钱,把一块足够长(不是无限长)的木板锯成n段,每段长度都告诉你了,让你求最小花费. 明显的huffman树,优先队列是个很 ...

  3. Huffman树及其编解码

    Huffman树--编解码 介绍:   Huffman树可以根据输入的字符串中某个字符出现的次数来给某个字符设定一个权值,然后可以根据权值的大小给一个给定的字符串编码,或者对一串编码进行解码,可以用于 ...

  4. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. Huffman编码(Huffman树)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...

  6. 【uva 10954】Add All(算法效率--Huffman编码+优先队列)

    题意:有N个数,每次选2个数合并为1个数,操作的开销就是这个新的数.直到只剩下1个数,问最小总开销. 解法:合并的操作可以转化为二叉树上的操作[建模],每次选两棵根树合并成一棵新树,新树的根权值等于两 ...

  7. Huffman树的编码译码

    上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...

  8. huffman树即Huffma编码的实现

    自己写的Huffman树生成与Huffman编码实现 (实现了核心功能 ,打出了每个字符的huffman编码 其他的懒得实现了,有兴趣的朋友可以自己在我的基础增加功能 ) /* 原创文章 转载请附上原 ...

  9. 哈夫曼(Huffman)树和哈夫曼编码

    一.哈夫曼(Huffman)树和哈夫曼编码 1.哈夫曼树(Huffman)又称最优二叉树,是一类带权路径长度最短的树, 常用于信息检测. 定义: 结点间的路径长度:树中一个结点到另一个结点之间分支数目 ...

随机推荐

  1. AC自动机妙用

    理解题意之后,很自然的想到了用AC自动机搞,结果网上一搜,全是暴搜,按照自己的思想,AC自动机搞起,果然在提交了数次之后,看到了Accept. AC自动机需要三个步骤: 第一步:建立字典树: 第二步: ...

  2. BZOJ 1878: [SDOI2009]HH的项链( BIT )

    离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...

  3. 虚拟机ping不通主机

    centos ping不通主机 首先检查网络设备 ifconfig -a 如果有eth0 , 又存在 eth1 . 那么service eth1 stop  然后在ping主机.(以上前提是网络地址设 ...

  4. js基础 1.简单js 语法 关键字 保留字 变量

    简单js JavaScript 是一个松散性的语言 对象属性却不想c中的结构体或者c++ 和java的对象, 对象继承机制 使用原型的prototype(原型链),js的分为三部分ECMAScript ...

  5. A Byte of Python 笔记(11)异常:try..except、try..finally

    第13章 异常 当你的程序中出现某些 异常的 状况的时候,异常就发生了. 错误 假如我们把 print 误拼为 Print,注意大写,这样 Python 会 引发 一个语法错误. 有一个SyntaxE ...

  6. [LeetCode]题解(python):006-ZigZag Conversion

    题目来源: https://leetcode.com/problems/zigzag-conversion/ 题意分析: 这道题目是字符串处理的题目.输入一个字符串和一个数字,将字符串填入倒Z形输入字 ...

  7. (Problem 53)Combinatoric selections

    There are exactly ten ways of selecting three from five, 12345: 123, 124, 125, 134, 135, 145, 234, 2 ...

  8. photoshop自动切图

    自动切图 前面的话 随着photoshop版本的不断升级,软件本身增加了很多新的功能,也为切图工作增加了很多的便利.photoshop最新的版本新增了自动切图功能,本文将详细介绍photoshop的这 ...

  9. 帝国cms7.2灵动标签万能教程

    学完本文,就完全能掌握帝国模板开发制作啦!这里只介绍sql语句调用方法(方便,快捷!) 灵动标签语法: [e:loop={,24,0}] 模板内容 [/e:loop] 详细解释:黄色部分:条件语句,即 ...

  10. perl lwp关闭ssl校验

    use LWP::UserAgent; use HTTP::Cookies; use HTTP::Headers; use HTTP::Response; use Encode; use File:: ...