赫夫曼树又称为最优二叉树:它是n个带权叶子节点构成的所有二叉树中,带权路径长度最小的二叉树。
赫夫曼数=树的带权路径长度WPL:树中所有叶子节点的带权路径长度之和 (带权路径是:叶子节点的数值乘经过的子节点数量)
1、
1 package demo9; 2 3 public class Node implements Comparable<Node>{ 4 int value; 5 Node left; 6 Node right; 7 8 public Node(int value){ 9 this.value=value; 10 } 11 12 @Override 13 public int compareTo(Node o) { 14 return -(this.value-o.value); 15 } 16 17 @Override 18 public String toString() { 19 return "Node [value=" + value + "]"; 20 } 21 22 23 24 }
2、
1 package demo9; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.List; 7 8 public class TestHuffmanTree{ 9 public static void main(String[] args){ 10 int[] arr={3,7,8,29,5,11,23,14}; 11 Node node=createHuffmanTree(arr); 12 13 System.out.println(); 14 } 15 16 //创建赫夫曼数 17 public static Node createHuffmanTree(int[] arr){ 18 //先使用数组中所有的元素创建若干个二叉树,(只有一个节点) 19 List<Node> nodes=new ArrayList<Node>(); 20 for(int value:arr){ 21 nodes.add(new Node(value)); 22 } 23 //循环处理 24 while(nodes.size()>1){ 25 //排序 26 Collections.sort(nodes); 27 //取出来权值最小的两个的二叉树 28 Node left=nodes.get(nodes.size()-1); 29 //取出最权值次小的二叉树 30 Node right=nodes.get(nodes.size()-2); 31 //创建一颗新的二叉树 32 Node node2=new Node(left.value+right.value); 33 //把取出来的两个二叉树移除 34 nodes.remove(left); 35 nodes.remove(right); 36 //放入原来的二叉树集合中 37 nodes.add(node2); 38 } 39 return nodes.get(0); 40 } 41 }