1. 程式人生 > >資料結構---哈夫曼樹(詳解)

資料結構---哈夫曼樹(詳解)

main.cpp

  1. #include”HuffmanTree.h”
  2. int  main()  
  3. {  
  4.     HuffmanTree HT;  
  5.     int *w,i,n;  
  6.  unsigned   int sum = 0;  
  7.     printf(”請輸入測試的個數(>1): ”);  
  8.     scanf(”%d”,&n);  
  9.     w=(int *)malloc((n+1)*sizeof(int *));  
  10.     w[0]=0;  
  11.     printf(”Enter weight:\n”);  
  12.     for(i=1;i<=n;i++)  
  13.     {    
  14.         printf(”w[%d]= ”
    ,i);    
  15.         scanf(” %d”,&w[i]);  
  16.     }  
  17.     sum= HuffmanCoding(HT,w,n);  
  18.     printf(”%d\n”,sum);  
  19.     system(”pause”);  
  20.     return 0;  
  21. }  

HuffmanTree.cpp

  1. #include”HuffmanTree.h”
  2. unsigned int HuffmanCoding(HuffmanTree &HT,int *w,int n)  
  3. {  
  4.     unsigned int i,s1=0,s2=0,m;  
  5.     unsigned int
     sum=0;  
  6.     HuffmanTree p;  
  7.     MinCode min;  
  8.     if(n<=1) //輸入個數少於1,則返回
  9.         return 0;  
  10.     m=2*n-1; //總結點數
  11.     HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //申請的哈夫曼樹的所佔空間
  12.     for(p=HT,i=0;i<=n;i++,p++,w++) //將n個結點 賦值權重,並初始化兒子結點
  13.     {   
  14.         p->weight=*w;    
  15.         p->parent=0;   
  16.         p->lchild=0;   
  17.         p->rchild=0;  
  18.     }  
  19.     for(;i<m;i++,p++) //將剩餘的結點初始化兒子結點
  20.     {   
  21.         p->weight=0;    
  22.         p->parent=0;   
  23.         p->lchild=0;  
  24.         p->rchild=0;  
  25.     }  
  26.     for(i=n+1;i<=m;i++) //對剩餘結點,結合權重,進行建立哈夫曼樹
  27.     {  
  28.         min=Select(HT,i-1);//在前n個結點中挑選2個權重最小的結點。
  29.         s1=min.s1;  
  30.         s2=min.s2;  
  31.         HT[s1].parent=i;   
  32.         HT[s2].parent=i;  
  33.         HT[i].lchild=s1;  
  34.         HT[i].rchild=s2;  
  35.         HT[i].weight=HT[s1].weight+HT[s2].weight;//此時 父節點的權重為。
  36.         sum +=HT[i].weight;  
  37.     }  
  38.     return sum;  
  39. }  
  40. MinCode Select(HuffmanTree &HT,unsigned int n)  
  41. {  
  42.     unsigned int min,smin,temp=0,i;  
  43.     int s1,s2,temp2;  
  44.     MinCode node;  
  45.     for(i=1;i<=n;i++)//挑選出一個 父節點 為零的結點
  46.     {  
  47.         if(HT[i].parent==0)  
  48.         {  
  49.         min=HT[i].weight;  
  50.         s1=i;  
  51.         break;  
  52.         }  
  53.     }  
  54.         temp=i++;  
  55.     for(;i<=n;i++) //挑選出的 s1與 其他的父節點為零的結點進行比較
  56.         if ((HT[i].weight<min)&&HT[i].parent==0)  
  57.         {  
  58.             min=HT[i].weight;  
  59.             s1=i;  
  60.         }  
  61.         for(i=temp;i<=n;i++)//接著 挑選s2
  62.         {  
  63.             if(HT[i].parent == 0 && i != s1)  
  64.             {  
  65.                 smin=HT[i].weight;  
  66.                 s2=i;  
  67.                 break;  
  68.             }  
  69.         }  
  70.         for(i=1;i<=n;i++) //並與其他結點進行比較
  71.         {  
  72.             if(HT[i].weight<smin&&i != s1&&HT[i].parent==0)  
  73.             {  
  74.                     smin=HT[i].weight;  
  75.                     s2=i;  
  76.             }  
  77.         }  
  78.         if(s1>s2){  
  79.             temp=s1;  
  80.             s1=s2;  
  81.             s2=temp;  
  82.         }  
  83.         node.s1=s1;  
  84.         node.s2=s2;  
  85.         return node;  
  86. }  

DS.h

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #define TRUE 1
  6. #define FALSE 0
  7. #define OK 1
  8. #define ERROR 0
  9. typedefint Status;  

HuffmanTree.h

  1. #include”DS.h”
  2. typedefstruct
  3. {  
  4.     unsigned int  weight;  
  5.     unsigned int  parent, lchild, rchild;  
  6.  } HTNode, *HuffmanTree;      //動態分配陣列儲存哈夫曼樹
  7. typedefstruct{  
  8.     unsigned int s1;  
  9.     unsigned int s2;  
  10. }MinCode;  
  11. typedefchar * * HuffmanCode;  //動態分配陣列儲存哈夫曼編碼表
  12. unsigned int HuffmanCoding(HuffmanTree &HT,int *w,int n);  
  13. //void Select(HuffmanTree HT,unsigned int n,int s1,int s2);
  14. MinCode Select(HuffmanTree &HT,unsigned int n);