/*

  例如,对于数列{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的更多相关文章

  1. (哈夫曼树)HuffmanTree的java实现

    参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...

  2. HuffmanTree的浅析和在C#中的算法实现

    无论是在我们的开发项目中,还是在我们的日常生活中,都会较多的涉及到文件压缩.谈到文件压缩,可能会有人想问文件压缩到底是怎么实现的,实现的原理是什么,对于开发人员来说,怎么实现这样一个压缩的功能. 接下 ...

  3. HuffmanTree && HuffmanCode

    如何构造HuffmanTree? Huffman算法: (1)根据给定的n个权值{w1, w2, ...,wn}构成n棵二叉树集合

  4. 6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第6章  树和二叉树 - 哈夫曼树(HuffmanTree) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版> ...

  5. 二叉树(5)HuffmanTree

    构建一棵 HuffmanTree. 测试代码 main.cpp: #include <iostream> #include "HuffmanTree.h" using ...

  6. 哈夫曼(huffman)树和哈夫曼编码

    哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...

  7. C++哈夫曼树编码和译码的实现

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

  8. Huffman Tree

    哈夫曼(Huffman)树又称最优二叉树.它是一种带权路径长度最短的树,应用非常广泛. 关于Huffman Tree会涉及到下面的一些概念: 1. 路径和路径长度路径是指在树中从一个结点到另一个结点所 ...

  9. Huffman的应用_Huffman编码

    //最优二叉树 #include <iostream> #include <iomanip> using namespace std; //定义结点类型 //[weight | ...

随机推荐

  1. Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货

    一.什么是 ES Nested 嵌套 Elasticsearch 有很多数据类型,大致如下: 基本数据类型: string 类型.ES 7.x 中,string 类型会升级为:text 和 keywo ...

  2. C#命名规范(简述)

    命名空间,类,事件,接口,常量,属性,方法使用Pascal命名,即首字母大写  参数,变量(类字段)使用camel命名法,即首字母小写. Pascal 方式--所有单词第一个字母大写,其他字母小写.  ...

  3. PHP使用array_unique对二维数组去重处理

    去重,点这里,东西是好东西,就是有点懒.莫见怪

  4. 详述Spring对数据校验支持的核心API:SmartValidator

    每篇一句 要致富,先修路.要使用,先...基础是需要垒砌的,做技术切勿空中楼阁 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JSR303.JSR349 ...

  5. CIDR的介绍

    CIDR的介绍: CIDR(Classless Inter-Domain Routing,无类域间路由选择)它消除了传统的A类.B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空 ...

  6. django第四次(转自刘江)

    我们都知道对于ManyToMany字段,Django采用的是第三张中间表的方式.通过这第三张表,来关联ManyToMany的双方.下面我们根据一个具体的例子,详细解说中间表的使用. 一.默认中间表 首 ...

  7. 脱壳系列_2_IAT加密壳_详细版_解法1_包含脚本

    1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进O ...

  8. Kubernetes容器集群管理环境 - Prometheus监控篇

    一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...

  9. 基于Spring框架应用的权限控制系统的研究和实现

    摘 要: Spring框架是一个优秀的多层J2EE系统框架,Spring本身没有提供对系统的安全性支持.Acegi是基于Spring IOC 和 AOP机制实现的一个安全框架.本文探讨了Acegi安全 ...

  10. 48.QT-网络通信讲解1

    网络概念 MAC地址(硬件地址) 网络IP地址(如192.168.1.101) 网络端口(实现多路通信,用来给不同应用程序来区分使用,范围0~65535,比如浏览网页服务(80端口), FTP服务(2 ...