构建哈夫曼树

构建哈夫曼树

 1 package com.hw.list0710;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Collections;
 5 
 6 public class Huffman {
 7     private static class Node implements Comparable<Node>{
 8         int value;
 9         Node left;
10         Node right;
11 
12         public Node(int value) {
13             this.value = value;
14         }
15 
16         @Override
17         public int compareTo(Node node) {
18             return this.value - node.value;
19         }
20 
21         public String toString() {
22             return "Node[value=" + value + "]";
23         }
24     }
25 
26     private static Node createHuffmanTree(int[] val) {
27         ArrayList<Node> list = new ArrayList<Node>();
28         for (int value : val) {
29 
30             list.add(new Node(value));
31         }
32         while(list.size() > 1)
33         {
34             Collections.sort(list);
35             Node leftNode = list.get(0);
36             Node rightNode = list.get(1);
37 
38             Node parent = new Node(leftNode.value + rightNode.value);
39             parent.left = leftNode;
40             parent.right = rightNode;
41             
42             list.remove(leftNode);
43             list.remove(rightNode);
44             list.add(parent);
45         }
46         return list.get(0);
47     }
48 
49     private static void preOrder(Node node) {
50         if (node != null) {
51             System.out.print(node.value+" ");
52             preOrder(node.left);
53             preOrder(node.right);
54         }
55     }
56 
57     public static void main(String[] args) {
58         int[] data = {13, 7, 8, 3, 29, 6, 1};
59         Node root = createHuffmanTree(data);
60         preOrder(root);
61     }
62 }

我们先把数组的所有元素存入一个list中,并进行排序,然后每次选取其中最小的两个,作和,添加到树中,同时list中删除原来的两个最小的元素,并添加和元素。

在一个循环中一直重复这个过程,直到list中还剩下一个元素为止。

为啥是还剩下一个元素时就要停止循环呢?因为当把最后两个最小的元素作和后(此时list中其实也只剩下这两个元素了),删除,再把和添加进去,此时的和就是哈夫曼树的头结点了。

运行效果:

 

 

posted @ 2021-08-05 21:45  EvanTheBoy  阅读(95)  评论(0编辑  收藏  举报