import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
/**
* 创建HuffmanTree
*
* @author LYYL
*
*/
public class HuffmanTree {
private static class Node
{
E data;
double weight;
Node leftChild;
Node rightChild;
public Node(E data, double weight){
this.data = data;
this.weight = weight;
}
public String toString(){
return "Node[data="+data+", weight" + weight + "]";
}
}
private Node createTree(List
nodes){
while(nodes.size() > 1){
quickSort(nodes);
Node left = nodes.get(nodes.size()-1);
Node right = nodes.get(nodes.size()-2);
Node parent = new Node(null, left.weight+right.weight);
parent.leftChild = left;
parent.rightChild = right;
nodes.remove(nodes.size()-1);
nodes.remove(nodes.size()-1);
nodes.add(parent);
}
return nodes.get(0);
}
//将指定数组的i和j索引处的元素交换
private void swap(List
nodes, int i, int j){
Node temp;
temp = nodes.get(i);
nodes.set(i, nodes.get(j));
nodes.set(j, temp);
}
//用快速排序法实现对节点进行排序
private void subSort(List
nodes, int start, int end){
if(start < end){
//以第一个元素最为分界值
Node base = nodes.get(start);
//i从左边搜索,搜索大于分界值的元素索引
int i = start;
//j从右边搜索,搜索小于分界值的索引
int j = end + 1;
while(true){
while(i < end && nodes.get(++i).weight >= base.weight);
while(j > start && nodes.get(--j).weight <=base.weight);
if(i < j){
swap(nodes, i, j);
}else{
break;
}
}
swap(nodes, start, j);
subSort(nodes, start, j-1);
subSort(nodes, j+1, end);
}
}
//快速排序节点
private void quickSort(List
nodes){ subSort(nodes, 0, nodes.size()-1); } //广度优先遍历 private List
breadthFirst(Node root){ Queue
queue = new ArrayDeque
(); List
list = new ArrayList
(); if(root != null){ queue.offer(root); } while(!queue.isEmpty()){ list.add(queue.peek()); Node p = queue.poll(); System.out.println(p.leftChild); if(p.leftChild != null){ queue.offer(p.leftChild); } if(p.rightChild != null){ queue.offer(p.rightChild); } } return list; } public static void main(String[] args) { List
nodes = new ArrayList
(); nodes.add(new Node("A", 40.0)); nodes.add(new Node("B", 8.0)); nodes.add(new Node("C", 10.0)); nodes.add(new Node("D", 30.0)); nodes.add(new Node("E", 10.0)); nodes.add(new Node("F", 20.0)); nodes.add(new Node("G", 3.0)); HuffmanTree huffmanTree = new HuffmanTree(); Node root = huffmanTree.createTree(nodes); System.out.println(huffmanTree.breadthFirst(root)); } }
创建HuffmanTree中的关键思想:
1、对List集合中所有节点进行排序
2、找出List集合中权值最小的两个节点
3、以权值最小的两个节点作为子节点创建新节点
4、从List集合中删除权值最小的最小的两个节点,将新节点添加到List集合中
程序采用循环不断地执行上面1、2、3、4步,直到List集合中只剩下一个节点,最后剩下的这个节点就是哈夫曼树的根节点。