本篇内容介绍了”如何使用Java赫夫曼树技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
基本介绍
给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也成为哈夫曼树(霍夫曼,树),还有的书翻译成霍夫曼树。
赫夫曼树是带权路径长度最短的树,权值较大的节点离根很近。
几个重要概念
- <李>
**节点的权和带权路径长度:**若将树种的节点赋给一个有某种含义的数值,则这个数值称为该节点的权。节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘积。
树的带权路径长度:树的带权路径长度规定为所有叶子节点的带权路径长度之和,即为WPL(weighted path length),权值越大的节点离根节点越近的二叉树才是最优二叉树。
WPL最小的就是赫夫曼树
* *路径和路径长度:* *在一颗树种,从一个节点往下可以达到的孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到L层节点的路径长度为:L - 1。
wpl=59的是赫夫曼树
赫夫曼树创建思路
给定一个数列{13,7,8,3,29,6,1},要求转成一个赫夫曼树
从小到大进行排序,将每一个数据都看成一个节点,每个节点可以看成是一颗最简单的二叉树。
取出根节点权值最小的两颗二叉树。
组成一颗新的二叉树,该新的二叉树的根节点的权值就是前面两个二叉树根节点权值的和。
再将这个新的二叉树,以根节点的权值大小排次排序,不断重复1-2-3-4的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树。如下图所示:
代码案例
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赫夫曼树技术