/*

  例如,对于数列{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;

}

}

}

最新文章

  1. h5+mui
  2. 邮箱验证 各种邮箱的smtp
  3. SOA服务设计与实现的几个语言无关的原则速记
  4. 【BZOJ 1096】【ZJOI 2007】仓库建设 DP+斜率优化
  5. 透视校正插值(Perspective-Correct Interpolation)
  6. 利用select函数的定时返回功能在Windows上实现微秒级的cpu休眠
  7. Nginx安装(zhuan)
  8. NT内存
  9. leetcode 120 Triangle ----- java
  10. STM32F0xx_RTC实时时钟配置详细过程
  11. Java基础知识强化之网络编程笔记24:Android网络通信之 AndroidAsync(基于nio的异步通信库)
  12. hdu4489(递推dp)
  13. 重庆/北京/江苏KS/快乐时时/七星/福运来菠菜电商开奖修复APP网站SSC网站程序开发php
  14. [原创]CentOS下Radius服务器搭建
  15. Spring MVC前后端的数据传输
  16. 敏捷测试(7)--基于story的敏捷基础知识
  17. [C]字符串行为
  18. php单例模式的使用场景,使用方法
  19. 第七十四课 图的遍历(BFS)
  20. python的requests快速上手、高级用法和身份认证

热门文章

  1. 题解 P2272 【[ZJOI2007]最大半连通子图】
  2. 人民网基于FISCO BCOS区块链技术推出“人民版权”平台
  3. nginx(二)
  4. 为 Editor.md 编辑器插件增加预览和发布按钮
  5. linux初学者-用户管理篇
  6. Java类方法重载与重写
  7. Deque 和Queue
  8. 【iOS】UILabel 常用属性设置
  9. 数据类型之Integer与int
  10. Linux 常见的常识及常用快捷键方式