学习java,挺好玩的呢

 

  赫夫曼树又称为最优二叉树:它是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 }

 

posted on 2018-11-20 23:34  axu521  阅读(219)  评论(0编辑  收藏  举报

<