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;
}
}
}
HuffmanTree的更多相关文章
- (哈夫曼树)HuffmanTree的java实现
参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...
- HuffmanTree的浅析和在C#中的算法实现
无论是在我们的开发项目中,还是在我们的日常生活中,都会较多的涉及到文件压缩.谈到文件压缩,可能会有人想问文件压缩到底是怎么实现的,实现的原理是什么,对于开发人员来说,怎么实现这样一个压缩的功能. 接下 ...
- HuffmanTree && HuffmanCode
如何构造HuffmanTree? Huffman算法: (1)根据给定的n个权值{w1, w2, ...,wn}构成n棵二叉树集合
- 6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第6章 树和二叉树 - 哈夫曼树(HuffmanTree) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版> ...
- 二叉树(5)HuffmanTree
构建一棵 HuffmanTree. 测试代码 main.cpp: #include <iostream> #include "HuffmanTree.h" using ...
- 哈夫曼(huffman)树和哈夫曼编码
哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...
- C++哈夫曼树编码和译码的实现
一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的 ...
- Huffman Tree
哈夫曼(Huffman)树又称最优二叉树.它是一种带权路径长度最短的树,应用非常广泛. 关于Huffman Tree会涉及到下面的一些概念: 1. 路径和路径长度路径是指在树中从一个结点到另一个结点所 ...
- Huffman的应用_Huffman编码
//最优二叉树 #include <iostream> #include <iomanip> using namespace std; //定义结点类型 //[weight | ...
随机推荐
- [leetcode] #112 Path Sum (easy)
原题链接 题意: 给定一个值,求出从树顶到某个叶(没有子节点)有没有一条路径等于该值. 思路: DFS Runtime: 4 ms, faster than 100.00% of C++ class ...
- html+css test1
模拟实验楼提供的一个网页.. [可由 git clone https://github.com/shiyanlou/finaltest 获取相关图片素材] <!DOCTYPE html>& ...
- decode函数的几种用法
1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 THEN RETURN(va ...
- 关于STM32F103+ESP8266+阿里云过程之设备状态更新至阿里云(三)
设备与阿里云完成发布订阅的功能,接下来就是将设备状态如温湿度,PM2.5值上报更新至阿里云. 1.查看Topic. 在阿里云平台上 设备->Topic列表中查看.在产品中也可以看到对应的Topi ...
- let和const解构赋值
1.let和const:最基础也很容易理解的,let是 声明一个变量,const是声明一个常量. 具体细节看如下实例代码 { let a=; console.log(a) } // console.l ...
- 在Linux - Centos上安装Python3(上)
必看内容 在Linux上安装Python常用的2种方法 1.Python源码编译安装,有点复杂,适合老司机 2.从EPEL/IUS仓库安装,新手建议使用些方法,比较简单,目前2019-07-31提供最 ...
- 【Sublime】设置显示编码格式
Mac 上的 Sublime 显示编码格式,设置方法: 右下角显示的 UTF-8 就是当前的编码格式. 添加如下代码: { "font_size": 18, // Display ...
- Selenium+java - 下拉框处理
常见下拉框也分两种:一种是标准控件和非标准控件(一般为前端开发人员自己封装的下拉框),本篇文章中将重点讲解标准下拉框操作. 1.Select提供了三种选择某一项的方法 select.selectByI ...
- maven 打包并导出 lib 第三方jar
一. maven 导出lib 包 执行命令 mvn dependency:copy-dependencies -DoutputDirectory=target/lib 或者在 eclipse 中执行, ...
- python3学习-logging模块
1.logging模块的使用非常简单,引入模块就可以使用. import logging logging.debug('This is debug message') logging.info('Th ...