数据结构---哈夫曼树(详解)

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.   
  3. unsigned int HuffmanCoding(HuffmanTree &HT,int *w,int n)  
  4. {  
  5.     unsigned int i,s1=0,s2=0,m;  
  6.     unsigned int sum=0;  
  7.     HuffmanTree p;  
  8.     MinCode min;  
  9.       
  10.     if(n<=1) //输入个数少于1,则返回  
  11.         return 0;  
  12.     m=2*n-1; //总结点数  
  13.     HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //申请的哈夫曼树的所占空间  
  14.     for(p=HT,i=0;i<=n;i++,p++,w++) //将n个结点 赋值权重,并初始化儿子结点  
  15.     {   
  16.         p->weight=*w;    
  17.         p->parent=0;   
  18.         p->lchild=0;   
  19.         p->rchild=0;  
  20.     }  
  21.     for(;i<m;i++,p++) //将剩余的结点初始化儿子结点  
  22.     {   
  23.         p->weight=0;    
  24.         p->parent=0;   
  25.         p->lchild=0;  
  26.         p->rchild=0;  
  27.     }  
  28.   
  29.     for(i=n+1;i<=m;i++) //对剩余结点,结合权重,进行建立哈夫曼树  
  30.     {  
  31.         min=Select(HT,i-1);//在前n个结点中挑选2个权重最小的结点。  
  32.         s1=min.s1;  
  33.         s2=min.s2;  
  34.         HT[s1].parent=i;   
  35.         HT[s2].parent=i;  
  36.         HT[i].lchild=s1;  
  37.         HT[i].rchild=s2;  
  38.         HT[i].weight=HT[s1].weight+HT[s2].weight;//此时 父节点的权重为。  
  39.         sum +=HT[i].weight;  
  40.   
  41.     }  
  42.   
  43.     return sum;  
  44.   
  45. }  
  46. MinCode Select(HuffmanTree &HT,unsigned int n)  
  47. {  
  48.     unsigned int min,smin,temp=0,i;  
  49.     int s1,s2,temp2;  
  50.     MinCode node;  
  51.     for(i=1;i<=n;i++)//挑选出一个 父节点 为零的结点  
  52.     {  
  53.         if(HT[i].parent==0)  
  54.         {  
  55.         min=HT[i].weight;  
  56.         s1=i;  
  57.         break;  
  58.         }  
  59.     }  
  60.         temp=i++;  
  61.     for(;i<=n;i++) //挑选出的 s1与 其他的父节点为零的结点进行比较  
  62.         if ((HT[i].weight<min)&&HT[i].parent==0)  
  63.         {  
  64.             min=HT[i].weight;  
  65.             s1=i;  
  66.         }  
  67.         for(i=temp;i<=n;i++)//接着 挑选s2  
  68.         {  
  69.             if(HT[i].parent == 0 && i != s1)  
  70.             {  
  71.                 smin=HT[i].weight;  
  72.                 s2=i;  
  73.                 break;  
  74.             }  
  75.         }  
  76.         for(i=1;i<=n;i++) //并与其他结点进行比较  
  77.         {  
  78.             if(HT[i].weight<smin&&i != s1&&HT[i].parent==0)  
  79.             {  
  80.                     smin=HT[i].weight;  
  81.                     s2=i;  
  82.             }  
  83.               
  84.         }  
  85.         if(s1>s2){  
  86.             temp=s1;  
  87.             s1=s2;  
  88.             s2=temp;  
  89.         }  
  90.         node.s1=s1;  
  91.         node.s2=s2;  
  92.         return node;  
  93.       
  94. }  

DS.h

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

HuffmanTree.h

  1. #include”DS.h”  
  2. typedef struct   
  3. {  
  4.     unsigned int  weight;  
  5.     unsigned int  parent, lchild, rchild;  
  6.  } HTNode, *HuffmanTree;      //动态分配数组存储哈夫曼树  
  7. typedef struct{  
  8.     unsigned int s1;  
  9.     unsigned int s2;  
  10. }MinCode;  
  11. typedef char * * 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);   

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值