树的路径长度是从树根到每一个结点的路径长度(经过的边数)之和。

n个结点的一般二叉树,为完全二叉树时取最小路径长度PL=0+1+1+2+2+2+2+…

带权路径长度=根结点到任意结点的路径长度*该结点的权。树的带权路径长度是所有叶结点的带权路径长度和。

带权路径长度WPL最小的扩充二叉树则不一定是完全二叉树,而是权值大的外结点离根结点最近的扩充二叉树。

构造Huffman树需要使用最小堆,组织森林并从中选出根结点权值最小的两棵树,组成新结点(权值等于两棵树根结点权值之和)。

假如构造的不是扩充二叉树而是扩充n叉树,则需要补充若干权值为0的结点,使得外部结点个数=内部结点个数*(n-1)+1。

最优二进制编码问题可以通过构造Huffman树解决。每个出现的字符都是一个独立的结点,权值为出现的频率或次数。最终可以得到哈夫曼编码,它是一种前缀编码(没有一个编码是另一个编码的前缀)。得到的WPL可以看成最终编码得到的二进制编码的长度。

得到的哈夫曼树不唯一(因为0代表坐子树还是右子树无规定)但带权路径相同且最优。

#include "heap.h"
const int DefaultSize=;
stract HuffmanNode{
float data;
HuffmanNode *leftChild,*rightChild,*parent;
HuffmanNode():leftChild(NULL),rightChild(NULl),parent(NULL){}
HuffmanNode(float elem,HuffmanNode *left=NULL,HuffmanNode *right=NULL,HuffmanNode *pr=NULL):data(elem),leftChild(left),rightChild(right),parent(pr){}
bool operator<=(HuffmanNode& R){return data<=R.data;}
bool operator>(HuffmanNode& R){return data>R.data;}
} class HuffmanTree{
public:
HuffmanTree(folat w[],int n);
~HuffmanTree(){deleteTree(root);}
protected:
HuffmanNode *root;
void deleteTree(HuffmanNode *t);
void mergeTree(HuffmanNode& ht1, HuffmanNode& ht2, HuffmanNode* &parent);
} HuffmanTree::HuffmanTree(folat w[],int n){
//给出n个权限w[0]~w[n-1],构造Huffman树
minHeap hp; //使用最小堆存放森林
HuffmanNode* parent,first,second,work;
for(int i=;i<n;i++){ //森林各棵树初始化
work.data=w[i];
work.leftChild=NULL;
work.rightChild=NULL;
hp.Insert(work);
}
for(int i=;i<n-;i++){ //执行n-1次mergeTree操作形成Huffman树
hp.RemoveMin(first);
hp.RemoveMin(second);
mergeTree(first,second,parent);
hp.Insert(parent);
}
root=parent;
} void HuffmanTree::mergeTree(HuffmanNode *bt1,HuffmanNode *bt2,HuffmanNode& *parent){
parent=new HuffmanNode;
parent->leftChild=bt1;
parent->rightChild=bt2;
parent->data=bt1->data+bt2->data;
bt1->parent=bt2->parent=parent;
}

数据结构-二叉树(6)哈夫曼树(Huffman树)/最优二叉树的更多相关文章

  1. 哈夫曼(Huffman)树和哈夫曼编码

    一.哈夫曼(Huffman)树和哈夫曼编码 1.哈夫曼树(Huffman)又称最优二叉树,是一类带权路径长度最短的树, 常用于信息检测. 定义: 结点间的路径长度:树中一个结点到另一个结点之间分支数目 ...

  2. 哈夫曼(huffman)树和哈夫曼编码

    哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...

  3. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

    20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...

  4. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  5. 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)

    前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...

  6. 数据压缩之经典——哈夫曼编码(Huffman)

    (笔记图片截图自课程Image and video processing: From Mars to Hollywood with a stop at the hospital的教学视频,使用时请注意 ...

  7. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

  9. 数据结构实训——哈夫曼(Huffman)编/译码器

    题目4.哈夫曼(Huffman)编/译码器(限1人完成) [问题描述] 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.但是,这要求在发送端通过一个编码系统对待传数据预先 ...

  10. <数据结构>XDOJ261.理解哈夫曼树

    问题与解答 问题描述: 假设用于通信的电文由 n(2≤n≤30)个字符组成,字符在电文中出现的频度(权值)为 w1 w2- wn,根据该权值集合构造哈夫曼树,并计算该树的带权路径长度. 输入说明: 输 ...

随机推荐

  1. matplotlib常用基础知识

    linestyle(ls)线型参数表 常用color(c)参数表 marker标记符号表 plt常用方法表 plt.legend(loc=0)用于显示图例,图例的位置参数loc matplotlib常 ...

  2. Seaborn实现单变量分析

    import numpy as np import pandas as pd from scipy import stats,integrate import matplotlib.pyplot as ...

  3. 遍历多个 txt 文件进行获取值

    import random def load_config(path): with open(path,'r') as tou: return [line for line in tou.readli ...

  4. Linux的VMWare中Centos7的安装

    Windows平台下VMWare 14安装Centos 7 一.虚拟机硬件配置 1.选择创建新的虚拟机: 2.选择自定义(高级)进行自定义配置,单击下一步: 3.选择虚拟机硬件兼容性为默认,单击下一步 ...

  5. 服务消费者(RestTemplate+Ribbon+feign)

    负载均衡 ​ spring cloud 体系中,我们知道服务之间的调用是通过http协议进行调用的.注册中心就是维护这些调用的服务的各个服务列表.在Spring中提供了RestTemplate,用于访 ...

  6. ASP.NET中使用Cache类来缓存页面的信息

    实现 如果将数据保存在全局应用程序对象Application中,值将会在程序运行时一直存在,而我们只需要缓存一段时间. ASP.NET提供了一个Cache对象来执行对象数据的缓存. Cache对象是S ...

  7. python 把多个list合并为dataframe并输出到csv文件

    import pandas as pd a = [1,2,3] b = ['a','b','c'] test = pd.DataFrame({'a_list':a,'b_list':b}) 将两个列表 ...

  8. 基于开源串口调试助手修改的qcom

    代码已上传码云: https://gitee.com/fensnote/qcom.git 源代码用于串口编程的学习很有价值,谢谢Qter的开源项目,感谢花心萝卜工作室的修改版本. 开源的qt开发的串口 ...

  9. 001_centos7下比特币源码编译安装

    今天我们介绍比特币的源码安装过程,是利用编译安装的 首先安装依赖 yum install -y boost-devel qt-devel protobuf-devel qrencode-devel l ...

  10. 020_go语言中的接口

    代码演示 package main import ( "fmt" "math" ) type geometry interface { area() float ...