梳子不爱头发 阅读(74) 评论(0)



      

 

 

      哈夫曼编码(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);
 }
}

效果如图所示:



 

 

 

  • 大小: 13.3 KB
  • 大小: 1.7 KB