数据结构之赫曼夫树(哈曼夫树)
Java实现赫夫曼树(哈夫曼树)的创建
目录
一、赫夫曼树是什么?
- 1.路径和路径长度
- 2.节点的权和带权路径长度
- 3.树的带权路径长度
二、创建赫夫曼树
- 1.图文创建过程
- 2.代码实现
一、赫夫曼树是什么?
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
图1 一棵赫夫曼树
1.路径和路径长度
在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。
例如图1根节点到b节点之间的通路称为一条路径。
在一条路径中,每经过一个结点,路径长度都要加 1 。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
例如图1根节点到c节点的路径长度为 4 - 1 = 3
2.节点的权和带权路径长度
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。
例如图1中abcd节点的权值分别为12、5、6、21
结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
例如图1节点c的带权路径长度为 3 * 6 = 18
3.树的带权路径长度
树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。
例如上图中的树的WPL = (5 + 6)* 3 + 12 * 2 + 21 = 78
二、创建赫夫曼树
1.图文创建过程
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:
例如有四个叶子节点 a b c d 权值分别为 12、5、6、21
创建赫夫曼树前森林如下
(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
在森林中取出 b c节点 形成一棵新树M
(3)从森林中删除选取的两棵树,并将新树加入森林;
将新树M添加到森林后 森林如下
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
- 4.1重复步骤(2)
在森林中取出权为11的节点以及a节点组成一棵新树N
- 4.2重复步骤(3)
将新树N添加到森林中 森林如下
- 4.3重复步骤(2)
在森林中取出b节点和权为23的节点组成一棵新树S
则新树S就是我们要创建的赫夫曼树
2.代码实现
构建结点类
package com.ma.tree.huffman;public class Node implements Comparable<Node>{public int value;public Node left;public Node right;public Node(int value) {this.value = value;}@Overridepublic int compareTo(Node o) {return this.value - o.value;}//前序遍历public void preselect(){System.out.println(this);if (this.left != null){this.left.preselect();}if (this.right != null){this.right.preselect();}}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';}
}
构建赫夫曼树
package com.ma.tree.huffman;import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;public class HuffmanTree {public static void main(String[] args) {int[] array = new int[]{1,432,2,11,34,45,542};preSelect( createHuffmanTree(array));}//把数列转化为赫夫曼树public static Node createHuffmanTree(int[] array){//1.遍历数组,//2.将每一个数组元素构成一个结点Node//3.将Node放入到集合中排序,从小到大List<Node> nodes = new ArrayList<Node>();for (int i = 0; i < array.length; i++) {Node node = new Node(array[i]);nodes.add(node);}//1.排序,从小到大//2.从取出最小的两个数 nodes.get(0),nodes.get(0)//3.创建一个新结点 Node root = new Node(nodes.get(0).value + nodes.get(1).value)//4.移除最小的两个 nodes.remove(0) nodes.remove(1)//5.在集合中添加新结点 nodes.add(root)//6.进入下一轮,排序........while (nodes.size() > 1){Collections.sort(nodes);System.out.println("集合中的元素:" + nodes);Node left = nodes.get(0);Node right = nodes.get(1);Node root = new Node(left.value + right.value);root.left = left;root.right = right;nodes.remove(left);nodes.remove(right);nodes.add(root);}return nodes.get(0);}//前序遍历public static void preSelect(Node root){if (root != null){root.preselect();}else {System.out.println("为空");}}
}
get(0);
}
//前序遍历
public static void preSelect(Node root){if (root != null){root.preselect();}else {System.out.println("为空");}
}
}
数据结构之赫曼夫树(哈曼夫树)相关推荐
- 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码
//严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...
- 数据结构-树(哈夫曼树)
树的基本概念 定义 树(Tree)是n(n>=0)个结点的有限集.n=0时成为空树. 在任意一个非空树中:有且仅有一个特定的称为根(Root)的结点:n>1时,其余结点可分为m(m> ...
- 种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
虽然今天不是植树节,但是我今天想种树. 文章目录 树,什么是树? 二叉树 定义 二叉树的创建 二叉树的前中后序遍历 前序遍历: 中序遍历 后序遍历 已知前序.中序遍历结果,还原二叉树 已知后序.中序遍 ...
- 霍夫曼树和霍夫曼编码以及霍夫曼编码的应用
文章目录 霍夫曼树介绍 1.1霍夫曼树的定义 1.2霍夫曼树的几个概念 1.3构建霍夫曼树的过程 1.4代码实现霍夫曼树 霍夫曼编码介绍 什么是霍夫曼编码 通信领域的应用 字符串压缩 1.构造霍夫曼树 ...
- huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码
艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...
- 最全哈夫曼树哈夫曼编码讲解,兄弟你值得拥有
目录 1.哈夫曼树的概念 路径概念 路径长度概念 节点的带权路径长度 树的带权路径长度 2.构建哈夫曼树的步骤 3.构建哈夫曼树的完整代 ...
- 哈夫曼编码、哈夫曼树
已知一个文件中出现的各字符及其对应的率如下表所示.若采用定长编码,则该文件中字符的码长应为( ).若采用Huffman编码,则字符序列face的编码应为( ) 字符 a b c d e f 频率 45 ...
- 15哈夫曼树/哈夫曼编码
文章目录 哈夫曼树的基本概念 哈夫曼树的特点 哈夫曼树的构造算法 1. 哈夫曼树的构造过程 代码实现 哈夫曼编码 文件的编码和解码 哈夫曼树的基本概念 哈夫曼树又称为最优树,作用是找到一种效率最高的判 ...
- 哈夫曼树 哈夫曼编码
哈夫曼树 哈夫曼树的定义:设二叉树具有 n 个带权值的叶节点,那么从根节点到各个叶节点的路径长度与相应叶节点权值的乘积的和,叫作二叉树的带权路径长度 WPL (Weighted Path Length ...
最新文章
- 独家 | 送你12个关于数据科学学习的关键提示(附链接)
- 以后看下try,catch在C#下面的成本
- mysql my.ini utf8_修改了my.ini没有效果,MySql的字符集还是没有变成utf8——mysql中文乱码...
- keepalived+lvs(HA+LB)
- 怎么让人爆照_瞬间变上相,让照片颜值大爆棚的跳跃照技巧
- Linux 进程状态 说明
- android获取ip命令
- 习题:交换一组数据的位置
- win10远程桌面查看对方计算机名,详细教你win10远程桌面连接命令
- BBS论坛经典Gif表情包合集
- 服务器如何推送消息到app,App中如何实现消息推送?
- 应用程序无法正常启动(0x000007b)或者找不到dll文件(以vcruntime140d.dll为例)的原因原理分析和解决方法(亲测已解决)
- 股票预测pythonlstm_LSTM预测股票涨跌--结合技术分析视角(一)
- 微软MSN博客申请使用全功略(转)
- 某软件大赛编程题(转)
- 《德鲁克管理思想精要》读书笔记4 - 企业诊断工具与目标管理
- 高中知识复习与拓展——数列的求和
- css 控制图片的横竖比例
- 真正的手机密码大全!
- 第四十九篇 复数的概念
热门文章
- Pytorch——报错解决:RuntimeError: Output 0 of SelectBackward is a view and is being modified inplace.
- android自定义打电话界面,两种Android打电话实现方法
- VUE获取节日(中国节+国际节)
- ECCV2020超分辨率方向论文整理笔记
- linux 卸载yum源,CentOS下rpm包与yum安装与卸载更新系统源
- 创意简约中国风新年快乐牛年大吉通用PPT模板
- 未来教育二级mysql怎么做题_计算机二级买了未来教育,但是不知道该怎么学习,就是单纯的刷题吗?感觉没有书有点不习惯,怎么办?...
- 如何获得FLV视频下载地址并下载
- 教你十种打领带的方法
- 使用GCD 转自 Posted by 唐巧