当前位置:网站首页>霍夫曼树(赫夫曼树、哈夫曼树)
霍夫曼树(赫夫曼树、哈夫曼树)
2022-08-08 06:26:00 【写做四月一日的四月一日】
霍夫曼树:给定n个权值做为n个叶子节点,若该树的带权路径长度达到最小,这棵树为最优二叉树,也称赫夫曼树。
霍夫曼树中的几个概念
路径和路径长度
一棵树中,一个节点往下可以达到的孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到第L层节点的路径长度为L-1.
节点的权及带权路径长度
若将树中节点赋给一个有某种含义的数值,则称这个数值为该节点的全,节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘积。
树的带权路径长度
所有叶子节点的带权路径长度之和,记为WPL。 权值越大的节点距离根节点月季的二叉树草率最有二叉树 wpl最小的就是赫夫曼树
霍夫曼树代码实现
public class Node implements Comparable<Node>{
private int value;
private Node left;
private Node right;
public Node() {
}
public Node(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
@Override
public String toString() {
return "" + value;
}
@Override
public int compareTo(Node o) {
return this.value - o.value;
}
public void preorderTraversal(){
System.out.println(this);
if (this.left != null){
this.left.preorderTraversal();
}
if (this.right != null){
this.right.preorderTraversal();
}
}
}
数组转霍夫曼树工具类
public class HuffmanUtil {
public static Node createHuffmanTree(int[] array){
List<Node> nodeList = new ArrayList<>();
for (int val : array){
nodeList.add(new Node(val));
}
Node root = null;
while (nodeList.size() > 1){
//排序
Collections.sort(nodeList);
//取出前两位
Node left = nodeList.get(0);
Node right = nodeList.get(1);
//得出和,新建节点
root = new Node(left.getValue() + right.getValue());
root.setLeft(left);
root.setRight(right);
//删除旧节点,加入新节点
nodeList.remove(left);
nodeList.remove(right);
nodeList.add(root);
}
return root;
}
}
测试方法(前序遍历输出赫夫曼树)
public class TestApp {
public static void main(String[] args) {
int[] array = {13,7,8,29,6,1};
Node root = HuffmanUtil.createHuffmanTree(array);
root.preorderTraversal();
}
}
边栏推荐
猜你喜欢
Vivado安装—Xilinx design tool already exists for 2019.1,specify a different program program group entr
Unity object color gradient effect (judgment logic implementation)
[Unity] 自定义日志系统 解决Unity Log的痛点
Unity—ParticleSystem (particle system) and Animator (animation state machine) batch manager
Unity 物体颜色渐变效果(判断逻辑实现)
类与对象之动静态方法,继承,名字的查找顺序,经典类和新式类,派生方法
Binary tree traversal and method
模块及模块导入
C language judges the problem of big and small endian storage
Unity_扇形图(饼状图)+ UI动画
随机推荐
《Filter Pruning using Hierarchical Group Sparse》ICPR2020论文详解
Unity_圆环滑动条(圆形、弧形滑动条)
括号问题
神经网络的图像识别技术,神经网络的层数怎么看
Unity 物体颜色渐变效果(判断逻辑实现)
NVIDIA CUDA Highly Parallel Processor Programming (6): Parallel Mode: Convolution
[Unity] GPU动画实现(二)——网格合并
Background Suppression Network for Weakly-supervised Temporal Action Localization
C language judges the problem of big and small endian storage
PURE(A Frustratingly Easy Approach for Entity and Relation Extraction)
tcpdump进行ARP抓包
ESP32 温湿度和气体传感器驱动
神经网络二分类问题范例,神经网络解决分类问题
【Unity】unity中对象池的使用
HDU 6029 个人分析
UGUI_动态修改轴心点Pivot
二分查找一个数首次与最后出现的位置
通过使用fgets()统计文件的行号和使用fgets()/fputs()拷贝文件
C语言实现链表的增删查改以及OJ题讲解
Markdown语法快速入门(以Topyra为例)