Huffman编码

编码字符:"w","o","r","l","d",权重值4,2,1,5,7。

  
  
  
  
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3.  
  4. typedef struct Node{  
  5.     int value;  
  6.     int parent;  
  7. }Node,*HTree;  
  8.  
  9.  
  10. void printCode(HTree tree,int l,int i);  
  11.  
  12. int main()  
  13. {  
  14.     int i,j;  
  15.     int w[5]={4,2,1,5,7};  
  16.     int n = 5;  
  17.     HTree tree = (Node*)malloc(sizeof(Node)*(2*n-1));  
  18.     //贪心策略构造Huffman树  
  19.     for (i=0;i<n;i++)  
  20.     {  
  21.         tree[i].value = w[i];  
  22.         tree[i].parent = 0;  
  23.     }  
  24.     for (i=n;i<2*n-1;i++)  
  25.     {  
  26.         int min1 = -1;  
  27.         int min2 = -1;  
  28.         for (j=0;j<i;j++)  
  29.         {  
  30.             if (tree[j].parent == 0)  
  31.             {  
  32.                 if (min1 == -1) min1 = j;  
  33.                 else if (min2 == -1)   
  34.                 {  
  35.                     min2 = j;  
  36.                     if (tree[min1].value>tree[min2].value)  
  37.                     {  
  38.                         int temp = min1;  
  39.                         min1 = min2;  
  40.                         min2 = temp;  
  41.                     }  
  42.                 }  
  43.                 else 
  44.                 {  
  45.                     if (tree[j].value<tree[min1].value)  
  46.                     {  
  47.                         min2 = min1;  
  48.                         min1 = j;  
  49.                     }  
  50.                     else if (tree[j].value<tree[min2].value)  
  51.                     {  
  52.                         min2 = j;  
  53.                     }  
  54.                 }  
  55.             }  
  56.         }  
  57.         tree[min1].parent = i;  
  58.         tree[min2].parent = i;  
  59.         tree[i].parent = 0;  
  60.         tree[i].value = tree[min1].value+tree[min2].value;  
  61.     }  
  62.           
  63.     //递归输出Huffman编码  
  64.     for (i=0;i<n;i++)  
  65.     {  
  66.         printCode(tree,2*n-1,i);  
  67.         printf("\r\n");  
  68.     }  
  69.     return 0;  
  70. }  
  71.  
  72. void printCode(HTree tree,int l,int i)  
  73. {  
  74.     if (tree[i].parent == 0) return;  
  75.     printCode(tree,l,tree[i].parent);  
  76.     if ((tree[tree[i].parent].value-tree[i].value)>tree[i].value) printf("0");  
  77.     else printf("1");  

 

结果:

01
001
000
10
11

 

你可能感兴趣的:(编码,Huffman)