Huffman树编码-优先队列实现
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树编码-优先队列实现的更多相关文章
- 【Huffman树贪心+优先队列】POJ3253-Fence Repair
思路详见之前的贪心专题,用优先队列来代替之前的插入排序,效率为O(nlogn) #include<iostream> #include<cstdio> #include< ...
- poj 3253 Fence Repair(优先队列+huffman树)
一个很长的英文背景,其他不说了,就是告诉你锯一个长度为多少的木板就要花多少的零钱,把一块足够长(不是无限长)的木板锯成n段,每段长度都告诉你了,让你求最小花费. 明显的huffman树,优先队列是个很 ...
- Huffman树及其编解码
Huffman树--编解码 介绍: Huffman树可以根据输入的字符串中某个字符出现的次数来给某个字符设定一个权值,然后可以根据权值的大小给一个给定的字符串编码,或者对一串编码进行解码,可以用于 ...
- [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Huffman编码(Huffman树)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...
- 【uva 10954】Add All(算法效率--Huffman编码+优先队列)
题意:有N个数,每次选2个数合并为1个数,操作的开销就是这个新的数.直到只剩下1个数,问最小总开销. 解法:合并的操作可以转化为二叉树上的操作[建模],每次选两棵根树合并成一棵新树,新树的根权值等于两 ...
- Huffman树的编码译码
上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...
- huffman树即Huffma编码的实现
自己写的Huffman树生成与Huffman编码实现 (实现了核心功能 ,打出了每个字符的huffman编码 其他的懒得实现了,有兴趣的朋友可以自己在我的基础增加功能 ) /* 原创文章 转载请附上原 ...
- 哈夫曼(Huffman)树和哈夫曼编码
一.哈夫曼(Huffman)树和哈夫曼编码 1.哈夫曼树(Huffman)又称最优二叉树,是一类带权路径长度最短的树, 常用于信息检测. 定义: 结点间的路径长度:树中一个结点到另一个结点之间分支数目 ...
随机推荐
- C++内联函数、函数模板之于头文件
一.基本说明 C++标准中提到,一个编译单元是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件 ...
- C——货物管理系统
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> ...
- Cyclomatic complexity
Cyclomatic Code Complexity was first introduced by Thomas McCabe in 1976. In 1976, Thomas McCabe pub ...
- eclipse设置web项目发布到tomcat根目录下
如果已经将项目绑定到服务器了,那就先删除服务器. 重新添加项目进服务器,双击 修改下面Server Locations到tomcat目录下 顺带可以修改下右上角的超时设置 再点击下方 这样就可以了.
- verilog中读取文件中的字符串_modelsim高级仿真
今天给个程序大家玩玩.因为今天遇到一个问题,就是要向UART发送指令,指令非常多,都是字符串.一直copy 函数 UART ("COMM_1"); UART ("COM ...
- javascript Node操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Oracle10g--plSql命令
每天学点Oracle10g--plSql命令 附录B SQL*PLUS Sql*plus 中使用绑定变量: sql> variable x number; sql> exec :x := ...
- javascript收集整理
//特殊字符去掉 function check(obj){ var test=obj.value.match(/[^A-Za-z0-9]/g);//这条语句表示在输入文本中是否包含不符合要求的字符,如 ...
- 安装 Rational Rose 启动报错:无法启动此程序,因为计算机中丢失 suite objects.dll
安装完以后提示找不到 suite objects.dll: 经查找,该 dll 存在: 找不到的原因是,安装程序自动设置在 Path 中的环境变量有误: 把最后的 common 改成 Common: ...
- 二代USBKEY与一代USBKEY有什么区别?使用时需要注意什么?
二代USBKEY相较于一代USBKEY产品,增加了屏幕以及按键功能:可通过二代USBKEY产品的屏幕查看交易或操作信息,通过按键的方式进行上翻.下翻.确认.取消等操作. 二代USBKEY产品采用Mic ...