文章目录

  • 一、相关概念
    • 1.节点的路径及路径长度
    • 2.节点的带权路径长度
    • 3.树的带权路径长度
    • 4.霍夫曼树
  • 二、构建步骤与图解
    • 1.构建步骤
    • 2.图解
  • 三、代码实现
    • 1.创建节点类:
    • 2.创建霍夫曼树
    • 3.全部代码

一、相关概念

1.节点的路径及路径长度

路径:在树中,一个节点向下到达另一个节点的通路,称为路径。
路径长度:路径中经历的分支数。

图中节点1到节点4的路径就是:1->2,2->4。路径长度为2。

2.节点的带权路径长度

在树中,可以定义某个节点的权值,从根节点到此节点的路径长度与此节点的权值的乘积就是该节点的带权路径长度。
例如:上图中若定义节点4的权值为4,则其带权路径长度为4*2=8。

3.树的带权路径长度

树中所有叶子节点的带权路径之和称为树的带权路径长度,简称WPL(weighted path length)。

4.霍夫曼树

拥有相同叶子节点的所有树中,WPL最小的树称为霍夫曼树,又称最优二叉树。

上图中右面的就为霍夫曼树(未画出所有情况)。

二、构建步骤与图解

1.构建步骤

目标:给定一个数列arr,其中元素对应叶子节点的权值,以此构建霍夫曼树。

  1. 将数列中各元素看成只有根节点的树,按权值对各树从小到大排序。
  2. 以其中最小的两颗树为左右子树构建成一颗新的树t,t的权值为两子树权值之和。
  3. 在数列中用t取代其左右子树,再对剩下的树按权值进行排序,并循环1,2步骤。
  4. 直到数列中只剩下一个元素,霍夫曼树就构建成了。

2.图解

以arr={2,3,4,12,7,6}为例。

1.排序{2,3,4,6,7,12},并取出前两个。

2.变为{4,6,7,12,5},排序{4,5,6,7,12},取出前两个。

3.变为{6,7,12,9},排序{6,7,9,12},取出前两个。

4.变为{9,12,13},取出前两个。

4.变为{13,21},取出前两个。

5.4.变为{34},结束。

三、代码实现

1.创建节点类:

class Node implements Comparable<Node> {int value;Node left;Node right;public Node(int value) {this.value = value;}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';}//排序需求@Overridepublic int compareTo(Node o) {return this.value - o.value;//从小到大排序}//前序遍历方法public void preOrderTraversal(Node root){if(root == null) return;System.out.println(root);preOrderTraversal(root.left);preOrderTraversal(root.right);}
}

2.创建霍夫曼树

public static Node huffmanTree(int[] arr){List<Node> nodes = new ArrayList<>();for (int data : arr) {//用arr建立多个node节点,存到nodes中nodes.add(new Node(data));}Node newNode = null;//构建霍夫曼树while(nodes.size() > 1){Collections.sort(nodes);//System.out.println(nodes);Node left = nodes.remove(0);Node right = nodes.remove(0);newNode = new Node(left.value + right.value);newNode.left = left;newNode.right = right;nodes.add(newNode);}return newNode;}
}

3.全部代码

public class HuffmanTree {public static void main(String[] args) {int[] arr = {2, 3, 4, 12, 7, 6};Node root = huffmanTree(arr);root.preOrderTraversal(root);}public static Node huffmanTree(int[] arr){List<Node> nodes = new ArrayList<>();for (int data : arr) {nodes.add(new Node(data));}Node newNode = null;while(nodes.size() > 1){Collections.sort(nodes);//System.out.println(nodes);Node left = nodes.remove(0);Node right = nodes.remove(0);newNode = new Node(left.value + right.value);newNode.left = left;newNode.right = right;nodes.add(newNode);}return newNode;}
}class Node implements Comparable<Node> {int value;Node left;Node right;public Node(int value) {this.value = value;}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';}@Overridepublic int compareTo(Node o) {return this.value - o.value;//从小到大排序}//前序遍历方法public void preOrderTraversal(Node root){if(root == null) return;System.out.println(root);preOrderTraversal(root.left);preOrderTraversal(root.right);}
}

霍夫曼树(最优二叉树)的实现相关推荐

  1. 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)

    目录 赫夫曼树概述 定义 构造赫夫曼树步骤 代码实现 赫夫曼树概述 HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树.霍夫曼树.哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度最短的二 ...

  2. 哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树

    整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2 ...

  3. 哈夫曼树-最优二叉树

    # 定义 1. 路径:结点中一个结点到另一个结点的通路(线)叫做路径 2. 路径长度:结点到另一个结点,线的累加和 3. 权:结点带有的数值 4. 带权路径长度:权×路径长度 最优二叉树指的是带权路径 ...

  4. java 实现最优二叉树_哈夫曼树(最优二叉树) - Java实现

    简介 哈夫曼树(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树.从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数称 ...

  5. 哈夫曼树 (最优二叉树)

  6. 数据结构(二叉树相关、满、完全二叉树、霍夫曼树、排序方法及时间复杂度总结、)笔记-day11

    目录 前言 一.树(Tree) 1.1树及特征 1.2二叉树概念及性质 1.3二叉树存储结构及遍历 1.4链式存储编码 二.霍夫曼树(最优二叉树) 2.1权值及带权路径长度 2.2霍夫曼树特征及构建 ...

  7. 深入学习二叉树(三) 霍夫曼树

    深入学习二叉树(三) 霍夫曼树 1 前言 霍夫曼树是二叉树的一种特殊形式,又称为最优二叉树,其主要作用在于数据压缩和编码长度的优化. 2 重要概念 2.1 路径和路径长度 在一棵树中,从一个结点往下可 ...

  8. 二叉树合集(二):霍夫曼树(图文详解)

    合集地址 二叉树合集(一):二叉树基础(含四种遍历,图文详解) 二叉树合集(二):霍夫曼树(图文详解) 二叉树合集(三):线索二叉树(图文详解) 二叉树合集(四):对称二叉树(递归和迭代实现) 二叉树 ...

  9. 数据结构之二叉树,二叉树存储结构,二叉树遍历,霍夫曼树以及图解

    数据结构之二叉树 树 什么是树? 树是一种一对多的数据结构.树有很多子集,比如:二叉树.完全二叉树.满二叉树.二叉搜索树等等. 树的特征: 没有父结点的叫做根,一个树有且只有一个根: 每个结点有0个或 ...

最新文章

  1. UITextField 限制用户输入小数点后位数的方法
  2. 数据安全最佳实践案例库建设项目案例征集
  3. [大数据] zookeeper 安装和配置
  4. linux桌面lxde 安装_Ubuntu 18.04下安装Lxde轻量桌面系统和VNC服务器
  5. mysql5.7+ 虚拟列,json使用初体验
  6. flume1.8 开发指南学习感悟
  7. 数据结构讲义代码堆和栈、多线程、多进程、网络编程
  8. 快速上手SpyGlass——基本流程
  9. React-Router 源码分析1
  10. OpenShift 4 之Kafka(2)-配置Kafka Bridge,通过HTTP访问Kafka Topic
  11. linux磁盘写保护怎么修改_linux – mount:无法重新安装块设备/ dev / sda5读写,是写保护的...
  12. 大学java怎么算学得好_为什么现在大学里很多计算机系的大学生,学编程的时候总学不好...
  13. OO第三单元总结——JML
  14. 机器学习预测机动车摇号:神秘的第七位
  15. 燃爆2022年的微服务架构
  16. h3c无线认证服务器,H3C无线路由器配置样例之带认证接入
  17. Ubuntu18.04双网卡配置内外网
  18. 个人认为最高效的学习方法【费曼学习法】
  19. 攻防世界——xff_referer
  20. SpringMVC 程序开发

热门文章

  1. optee:kernel space调用user space进程时候的硬件行为
  2. 2021-06-05
  3. BeautifulSoup库使用
  4. Golang和Ethereum中的big.Int
  5. 关于CVE-2019-0708 - 数组越界
  6. c++ lambda基本语法
  7. laravel 中添加自定义辅助函数helpers.php
  8. 1.19 String、StringBuffer和StringBuilder类的区别
  9. getId()方法的作用
  10. “九韶杯”河科院程序设计协会第一届程序设计竞赛 【前六题解析】