/*

  例如,对于数列{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. 个人永久性免费-Excel催化剂功能第98波-零代码零距离轻松接触并拥有金融大数据

    数据产生价值的一个最突出的领域-金融领域,股票.证券.上市公司财务报表等,多少人在其中发掘出宝贵的数据价值.今天Excel催化剂联合Tushare金融大数据平台,让这一切的数据都能成为你我普通人零代码 ...

  2. Excel催化剂开源第27波-Excel离线生成词云图

    在数据分析领域,词云图已经成为在文本分析中装逼的首选图表,大家热烈地讨论如何在Python上做数据分析.做词云图. 数据分析从来都是Excel的主战场,能够让普通用户使用上的技术才是最有价值的技术,一 ...

  3. c语言进阶8-数据结构

    一.  数据结构的起源: 1.        为什么要学习数据结构 阿基米德说过:“给我一个支点,我就能翘起地球”.那么给我一个程序,我就能用好程序,给我一个结构,我就能把内容填充完成.打个比方,一个 ...

  4. python课堂整理19----迭代器和生成器

    一.概念 • 迭代器协议: 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个stopIteration异常,以终止迭代(只能往后走,不能往前退) • 协议是一种约定,pyt ...

  5. case和decode的用法(行转列)

    创建了一张成绩表,如下图所示: 在oracle中,这两个函数我们都可以使用,代码及结果如下: decode用法: select Name,decode(Subject,'语文',1,'数学',2,'英 ...

  6. java并发之ConcurrentLinkedQueue

    在并发编程中,我们可能经常需要用到线程安全的队列,JDK提供了两种模式的队列:阻塞队列和非阻塞队列.阻塞队列使用锁实现,非阻塞队列使用CAS实现.ConcurrentLinkedQueue是一个基于链 ...

  7. Android | Sqlite3

    Android 数据库创建及使用: 创建: package he3.sd.dao; import android.content.Context; import android.database.sq ...

  8. Android活动(Activity)创建及生命周期

       Activity是Android的门面,可以与用户进行互动的重要模块,凡是在应用中可以看到的东西,都是放在活动中的.   在学习新的技术时,我喜欢将需要学习的技术与自己懂得技术进行类似比较,而活 ...

  9. [Abp vNext 源码分析] - 7. 权限与验证

    一.简要说明 在上篇文章里面,我们在 ApplicationService 当中看到了权限检测代码,通过注入 IAuthorizationService 就可以实现权限检测.不过跳转到源码才发现,这个 ...

  10. Selenium+java - Ajax浮动框处理

    Ajax浮动框 我们常遇到的某些网站首页输入框,点击后显示的浮动下拉热点,如下图: 实际案例 模拟场景如下: hao123首页搜索输入框,单击搜索框,点击浮动框中的哪吒票房破30亿,单击后选项的文字内 ...