HuffmanTree
/*
例如,对于数列{pi}={5,
3, 8, 2, 9},Huffman树的构造过程如下:
1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。
2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。
3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。
4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。
*/
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef struct node{
struct
node *left;
struct
node *right;
int
weight;
char
data;
}Huff;
class Huffm{
private:
Huff
**F;
int
n;
Huff
*root;
public:
Huffm(int *pi,int n){
Huff
*p=NULL;
F=(Huff **)malloc(sizeof(Huff *));
for(int i=0;i < n ;i++){
p=(Huff *)malloc(sizeof(Huff));
p->left=p->right=NULL;
p->weight=pi[i];
p->data='a'+i;
F[i]=p;
}//for
this->n=n;
}
void
BuiltHuff();//建树
Huff *gettree();//返回头结点
void Printree(Huff *tree);//层遍历输出整棵树
};
int main(void)
{
int
pi[]={5,3,8,2,9};
Huffm
*tree=new Huffm(pi,5);
tree->BuiltHuff();
Huff
*root=tree->gettree();
tree->Printree(root);
return
0;
}
void Huffm::BuiltHuff()
{
Huff
*p=NULL;
int
k1,k2;
for(int
i=0;i<n-1;i++){
//最小次小
for(k1=0;!F[k1];k1++);
for(k2=k1+1;!F[k2];k2++);
for(int
j=k2;j<n;j++){
if(F[j]){
if(F[j]->weight<F[k1]->weight){
k2=k1;
k1=j;
}else
if(F[j]->weight<F[k2]->weight){
k2=j;
}
}/*if
F[j] */
}/*for
j*/
//建树
p=(Huff *)malloc(sizeof(Huff));
p->data=0;
p->left=F[k1];
p->right=F[k2];
p->weight=F[k1]->weight+F[k2]->weight;
F[k1]=p;
F[k2]=NULL;
}/*for
i*/
this->root=F[k1];
}
Huff *Huffm::gettree()//返回头结点
{
return
root;
}
void Huffm::Printree(Huff *tree)//层遍历输出整棵树
{
Huff **p=(Huff **)malloc(sizeof(Huff *));
Huff *pnode=NULL;
int head=0,tail=0;
p[++tail]=tree;
while(tail!=head){
head=(head+1)%5;
cout<<p[head]->weight<<p[head]->data<<"
";
pnode=p[head];
if(pnode->left){
tail=(tail+1)%5;
p[tail]=pnode->left;
}
if(pnode->right){
tail=(tail+1)%5;
p[tail]=pnode->right;
}
}
}
HuffmanTree的更多相关文章
- (哈夫曼树)HuffmanTree的java实现
参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...
- HuffmanTree的浅析和在C#中的算法实现
无论是在我们的开发项目中,还是在我们的日常生活中,都会较多的涉及到文件压缩.谈到文件压缩,可能会有人想问文件压缩到底是怎么实现的,实现的原理是什么,对于开发人员来说,怎么实现这样一个压缩的功能. 接下 ...
- HuffmanTree && HuffmanCode
如何构造HuffmanTree? Huffman算法: (1)根据给定的n个权值{w1, w2, ...,wn}构成n棵二叉树集合
- 6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第6章 树和二叉树 - 哈夫曼树(HuffmanTree) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版> ...
- 二叉树(5)HuffmanTree
构建一棵 HuffmanTree. 测试代码 main.cpp: #include <iostream> #include "HuffmanTree.h" using ...
- 哈夫曼(huffman)树和哈夫曼编码
哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...
- C++哈夫曼树编码和译码的实现
一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的 ...
- Huffman Tree
哈夫曼(Huffman)树又称最优二叉树.它是一种带权路径长度最短的树,应用非常广泛. 关于Huffman Tree会涉及到下面的一些概念: 1. 路径和路径长度路径是指在树中从一个结点到另一个结点所 ...
- Huffman的应用_Huffman编码
//最优二叉树 #include <iostream> #include <iomanip> using namespace std; //定义结点类型 //[weight | ...
随机推荐
- e校帮V1.1使用指南
2017年04月17日,e校帮正式版本V1.1.4正式上线了.大家可以在e校帮官网进行下载,http://exiaobang.top 或者在搜狗手机助手/搜狗输入法/酷安进行下载. e校帮简介: e校 ...
- sklearn使用技巧
sklearn使用技巧 sklearn上面对自己api的解释已经做的淋漓尽致,但对于只需要短时间入手的同学来说,还是比较复杂的,下面将会列举sklearn的使用技巧. 预处理 主要在sklearn.p ...
- SPC 数据分析工具
趁着公司在做QMS软件,自己实现一个简易版,类似minitab的工具. 环境:.net framework 4.0 目前提供功能: 数据存储,载入 计量型控制图:单值移动极差图.均值极差图.均值标准差 ...
- C++里long的字节数
标准规定long的大小不小于int也就是说sizeof(long)>=sizeof(int). Numerical type sizes in C (bits) Platforms \ T ...
- Flume+Kafka收集Docker容器内分布式日志应用实践
1 背景和问题 随着云计算.PaaS平台的普及,虚拟化.容器化等技术的应用,例如Docker等技术,越来越多的服务会部署在云端.通常,我们需要需要获取日志,来进行监控.分析.预测.统计等工作,但是云端 ...
- Redis(六)--- Redis过期策略与内存淘汰机制
1.简述 关于Redis键的过期策略,首先要了解两种时间的区别,生存时间和过期时间: 生存时间:一段时长,如30秒.6000毫秒,设置键的生存时间就是设置这个键可以存在多长时间,命令有两个 expir ...
- ASP.NET Core - 实现自定义WebApi模型验证
Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...
- input属性设置type="number"之后, 仍可输入e, E, -, + 的解决办法
<el-input v-model="scope.row.variables.leaderbuweiscores.score" @keyup.native="cha ...
- OV SSL证书有哪些功能?网站安装OV SSL证书的好处
OV SSL证书英文名称为Organization Validation SSL Certificate,申请OV SSL证书需要审核申请者对域名是否拥有控制权,同时审核申请者是否为一个合法登记.真实 ...
- Docker相关地址
Docker社区版(CE)地址: https://hub.docker.com/search/?type=edition&offering=community Docker文档地址: http ...