构建哈夫曼树
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中其实也只剩下这两个元素了),删除,再把和添加进去,此时的和就是哈夫曼树的头结点了。
运行效果: