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