/*

  例如,对于数列{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. spring配置文件比较全的约束

    个人总结:Spring的配置文件applicationContext.xml约束文件.全面约束 <?xml version="1.0" encoding="utf- ...

  2. JAVA开发异常处理十大秘诀

    1.前提 第一层:遇到异常首先必须告诉自己,冷静,不要慌.(一看到Bug就心慌,那么武功就施展不了了) 2.入门级 第二层:遇到Bug,第一潜意识看输出异常的信息的(控制台输出,Junit输出,页面输 ...

  3. 读完这篇文章,5G 就没有秘密了

    如果我们现在要制作一个 2019 年的热词排行榜,相信 5G 一定名列榜单前茅.作为第五代移动通信网络,5G 技术一直备受瞩目.随着 5G 商用牌照在国内的发放,各大手机厂商也是紧接着推出各款 5G ...

  4. python购物车升级版

    各文件内容 前言 功能架构等请参考前一篇博客,此篇博客为进阶版的存代码展示. 详细文件内容 启动文件 starts.py启动文件 import os import sys BASE_DIR = os. ...

  5. 2019杭电多校第二场hdu6601 Keen On Everything But Triangle

    Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...

  6. .NET领域驱动设计—初尝(一:疑问、模式、原则、工具、过程、框架、实践)

     .NET领域驱动设计—初尝(一:疑问.模式.原则.工具.过程.框架.实践) 2013-04-07 17:35:27 标签:.NET DDD 驱动设计 原创作品,允许转载,转载时请务必以超链接形式标明 ...

  7. dedecms新建内容模型“把数据保存到数据库附加表时出错‘xxx’出错”错误的原因分析和解决方案(转)

    把数据保存到数据库附加表 `bc_addonarticle17` 时出错,请把相关信息提交给DedeCms官方.INSERT INTO `bc_addonarticle17`(aid,typeid,r ...

  8. iframe插入视频自动播放代码

    <iframe marginwidth=0 marginheight=0 src='http://www.wsview.com/yzplayerAction!play2.action?autoP ...

  9. Jenkins-slave实现并行的自动化测试

    前言 上篇文章搭建了Jenkins-slave的分布式测试环境,我一直在想一个问题,使用这种模式能不能实现并发的自动化测试?我的想法是:同一套UI自动化的测试代码,是否能够通过一个Job绑定多个sla ...

  10. JDBC教程

    JDBC代表Java与数据库的连接,这对Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API. JDBC库包含的API为每个通常与数据库的使用相关联的任务: 使得连接到数据库 创 ...