哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
以下是代码实现:
public class HFM {
class Node{
Node left;
Node right;
String code="";
int data;
}
public void creatTree(int [] datas){
Node [] nodes=new Node[datas.length]; // 新建一个长度为传入数组长度的Node类型
//遍历将传入数组的值赋给node数组,同时为每个node【i】开辟一个堆空间
for(int i=0;i<nodes.length;i++){
nodes[i]=new Node();
nodes[i].data=datas[i];
}
//当长度大于1时
while(nodes.length>1){
//只要当长度大于一时,开始排序
sort(nodes);
//赋值
Node n1 = nodes[0];
Node n2 = nodes[1];
Node node = new Node();
//左节点指向n1
node.left = n1;
//右节点指向n2
node.right = n2;
//得到相加的值
node.data = n1.data +n2.data;
//新建node型数组,比原节点少一个
Node[] nodes2 = new Node[nodes.length-1];
//将n1,n2,删除掉,将数组从nodes2【2】开始
for(int i = 2; i<nodes.length;i++){
nodes2[i-2]=nodes[i];
}
//将新建的数组地址赋给node
nodes2[nodes2.length-1]=node;
//更新数组
nodes = nodes2;
}
//根节点指向更新后数组首地址
Node root = nodes[0];
//打印树
printTree(root,"");
}
public void printTree(Node node ,String code){
if(node!=null){
//先序遍历
if(node.left==null&&node.right==null)//有了条件只打印叶结点
System.out.println(node.data+"的编码是:"+code);
printTree(node.left,code+"0");
printTree(node.right,code+"1");
}
}
public void sort(Node[] nodes){
//冒泡法排序
for(int i = 0;i<nodes.length;i++){
for(int j = i;j<nodes.length;j++){
if(nodes[i].data>nodes[j].data){
Node temp = new Node();
temp=nodes[i];
nodes[i]=nodes[j];
nodes[j]=temp;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
HFM hfm = new HFM();
int[] datas = {3,2,7,4,0};
hfm.creatTree(datas);
}
}
效果如图所示: