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

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. 关于RecyclerView(二)设置EmptyView

    首先重写一个RecyclerView类 package com.onepilltest.others; import android.content.Context; import android.s ...

  2. 第一章 Java快速入门

    1.1.安装开发环境 第一步:打开下载地址,下载对应平台的 JDK 安装包 第二步:打开下载软件,全部默认下一步傻瓜式安装 1.2.配置环境变量 第一步:配置JAVA_HOME 第二步:配置CLASS ...

  3. Python os.tcgetpgrp() 方法

    概述 os.tcgetpgrp() 方法用于回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组.高佣联盟 www.cgewang.com 语法 tcgetpgrp()方法语法格 ...

  4. 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造

    一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...

  5. 解析Class文件

    类文件解析的入口是ClassFileParser类中定义的parseClassFile()方法.上一小节得到了文件字节流stream后,接着会在ClassLoader::load_classfile( ...

  6. Linux的VMWare中Centos7文件系统挂载和开启网卡及简单命令

    一.路径 挂载磁盘/etc/fastab  开启网卡 vi .bash_profile              ---更改PATH环境变量 可设置 mysql提示符 cd  /etc/yum.rep ...

  7. “随手记”开发记录day08

    今天完成了关于统计页面中的关于每月支出和每月收入的页面

  8. Python数据类型-dic,set常见操作

    字典常见方法   语法:字典名[新key]=value 功能:给字典增加键值 语法:字典名[字典里存在的key]=新的value 功能:修改字典里的值   功能:删除字典的元素,通过key来进行删除, ...

  9. Java—时间的原点 计算时间所使用的 Date类/DateFormat类/Calendar类

    Date类 类 Date 表示特定的瞬间,精确到毫秒. 毫秒概念:1000毫秒=1秒 毫秒的0点: System.currentTimeMillis()  返回值long类型参数 用于获取当前日期的毫 ...

  10. 2020-05-27:SpringCloud用了那些组件?分布式追踪链怎么做的?熔断器工作原理?

    福哥答案2020-05-27: SpringCloud分布式开发五大组件详解服务发现——Netflix Eureka客服端负载均衡——Netflix Ribbon断路器——Netflix Hystri ...