赫夫曼树:带权路径最小的二叉树
public class HuffmanTree
{
publlic class Node implements Comparable<Node >
{
int weight;
Node left = null;
Node right = null;
public Node (int weight)
{
this.weight = weight;
}
//实现Comparable接口是为了能够比较Node中元素的大小
@Override
public int compareTo(Node o)
{
return -(this.value - o.value);//从大到小进行排序
}
}
//利用数组创建赫夫曼树
public Node CreateHuffmanTree(int[] data)
{
//先使用数组中的元素创建如果个二叉树(开始时一个元素就是一个二叉树)
ArrayList<Node> list = new ArrayList<Node>();
for(int i = 0; i < data.length; i++)
{
list.add(new Node(data[i]));
}
while(list.size() > 1)
{
//对集合list进行排序
Collections.sort(list);
//从集合中取出权最小的二叉树
Node left = list.get(list.size() - 1);
Node right = list.get(list.size() - 2);
//将取出的二叉树合并为一颗二叉树
Node Parent = new Node(left.weight+right.weight);
Parent.left = left;
Parent.right = right;
//从集合中删除取出的这两个节点
list.remove(left);
list.remove(right);
//将新创建的节点添加到集合中
list.add(Parent);
}
//集合中的第一个节点即为赫夫曼树的根节点
return list.get(0);
}
}