如何使用Java赫夫曼树技术

介绍

本篇内容介绍了”如何使用Java赫夫曼树技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

如何使用Java赫夫曼树技术

基本介绍

给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也成为哈夫曼树(霍夫曼,树),还有的书翻译成霍夫曼树。

赫夫曼树是带权路径长度最短的树,权值较大的节点离根很近。

几个重要概念

<李>

* *路径和路径长度:* *在一颗树种,从一个节点往下可以达到的孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到L层节点的路径长度为:L - 1。

  • **节点的权和带权路径长度:**若将树种的节点赋给一个有某种含义的数值,则这个数值称为该节点的权。节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘积。

  • 树的带权路径长度:树的带权路径长度规定为所有叶子节点的带权路径长度之和,即为WPL(weighted path  length),权值越大的节点离根节点越近的二叉树才是最优二叉树。

  • WPL最小的就是赫夫曼树

  • 如何使用Java赫夫曼树技术

    wpl=59的是赫夫曼树

    赫夫曼树创建思路

    给定一个数列{13,7,8,3,29,6,1},要求转成一个赫夫曼树

    1. 从小到大进行排序,将每一个数据都看成一个节点,每个节点可以看成是一颗最简单的二叉树。

    2. 取出根节点权值最小的两颗二叉树。

    3. 组成一颗新的二叉树,该新的二叉树的根节点的权值就是前面两个二叉树根节点权值的和。

    4. 再将这个新的二叉树,以根节点的权值大小排次排序,不断重复1-2-3-4的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树。如下图所示:

    如何使用Java赫夫曼树技术

    代码案例

    package com.xie.huffmantree;  import java.util.ArrayList; import java.util.Collections; import java.util.List;  public class HuffmanTree {     public static void main(String[] args) {         int[] arr = {13, 7, 8, 3, 29, 6, 1};         Node huffmanTree = createHuffmanTree(arr);         //前序遍历         preOrder(huffmanTree);         /**          * Node{value=https://www.yisu.com/zixun/67}          * Node{value=29}          * Node{value=38}          * Node{value=15}          * Node{value=7}          * Node{value=8}          * Node{value=23}          * Node{value=10}          * Node{value=4}          * Node{value=1}          * Node{value=3}          * Node{value=6}          * Node{value=13}          */}//创建赫夫曼树     public static Node createHuffmanTree(int[] arr) {//第一步为了操作方便//1.遍历arr数组//2。将arr的每个元素构成一个节点//3。将节点放入ArrayList中节点列表<节点>=new ArrayList <> ();(int值:arr){节点。添加新节点(值));},(nodes.size()> 1){//排序从小到大Collections.sort(节点);system . out。println(节点“节点=" +);//取出根节点权值最小的两颗二叉树//(1)取出权值最小的节点(二叉树)节点leftNode=nodes.get (0);//(2)取出权值第二小的节点(二叉树)节点rightNode=nodes.get (1);//(3)构建一颗新的二叉树节点的父=新节点(leftNode。值+ rightNode.value);的父母。左=leftNode;的父母。roght=rightNode;//(4)从ArrayList中删除处理过的二叉树nodes.remove (leftNode);nodes.remove (rightNode);//(5)将父母加入节点nodes.add(父);}//返回赫夫曼树的根节点返回nodes.get (0);}公共静态无效预订(节点节点){如果(节点!=null) {node.preOrder ();其他}{System.out.println(“是空树,不能遍历~ ~”);}}}//创建节点类,为了让节点对象支持排序,实现了Comparble接口类节点实现类似

    如何使用Java赫夫曼树技术