赫夫曼树(最优二叉树)

。在选择最小s1s2的时候少了一个空语句分号。。调试了好久。。坑爹。

这个是最优的编码策略能达到最少的编码

  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<math.h>
  5 #include<queue>
  6 #include<algorithm>
  7 using namespace std;
  8 typedef struct
  9 {
 10     unsigned int weight;
 11     unsigned int parent,lchild,rchild;
 12 }htnode,*huffmantree;
 13 typedef char* huffmancode;
 14 void select(huffmantree *ht,int n,int *s1,int *s2)//赫夫曼树指针
 15 {
 16     int i;
 17     for(i=1;i<=n&&(*ht)[i].parent!=0;i++) ;//!!!!!!!!坑爹
 18         *s1=i;
 19     for(i=1;i<=n;i++)
 20         if((*ht)[i].parent==0&&((*ht)[i].weight<(*ht)[*s1].weight))
 21             *s1=i;
 22     for(i=1;i<=n;i++)
 23         if((*ht)[i].parent==0&&i!=*s1)
 24             break;
 25         *s2=i;
 26     for(i=1;i<=n;i++)
 27         if((*ht)[i].parent==0&&i!=*s1&&((*ht)[i].weight<(*ht)[*s2].weight))
 28                 *s2=i;
 29 }
 30 void huffmancoding(huffmantree *ht,huffmancode *hc,int *w,int n)
 31 {
 32     char *cd;
 33     int m,i,start,f,s1,s2;
 34     unsigned int c;
 35     if(n<=1)return;
 36     m=2*n-1;
 37     *ht=(huffmantree)malloc((m+1)*sizeof(htnode));
 38     for(i=1;i<=n;i++)
 39     {
 40         (*ht)[i].weight=w[i];
 41         (*ht)[i].lchild=0;
 42         (*ht)[i].rchild=0;
 43         (*ht)[i].parent=0;
 44     }//赋值
 45     for(i=n+1;i<=m;i++)//后面空间清零
 46     {
 47         (*ht)[i].weight=0;
 48         (*ht)[i].parent=0;
 49         (*ht)[i].lchild=0;
 50         (*ht)[i].rchild=0;
 51     }
 52     for(i=n+1;i<=m;i++)
 53     {
 54         select(ht,i-1,&s1,&s2);//找最小的s1,s2结点
 55         (*ht)[s1].parent=i;(*ht)[s2].parent=i;
 56         (*ht)[i].lchild=s1;(*ht)[i].rchild=s2;
 57         (*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight;
 58     }
 59     hc=(huffmancode*)malloc((n+1)*sizeof(char*));//n个编码的头指针
 60     cd=(char *)malloc(n*sizeof(char));//当前编码空间
 61     cd[n-1]='\0';//从右向左放编码,首先放末尾的结束标志
 62     for(i=1;i<=n;i++)//求结点的赫夫曼码
 63     {
 64         start=n-1;
 65         for(c=i,f=(*ht)[i].parent;f!=0;c=f,f=(*ht)[f].parent)
 66         {
 67             if((*ht)[f].lchild==c)
 68                 cd[--start]='0';
 69             else
 70                 cd[--start]='1';
 71         }
 72         hc[i]=(char*)malloc((n-start)*sizeof(char));
 73         strcpy(hc[i],&cd[start]);
 74     }
 75     free(cd);
 76     for(i=1;i<=26;i++)
 77         printf("%c---%s\n",i+96,hc[i]);
 78 }
 79 char s[1000];
 80 int a[30]={0};
 81 int main()
 82 {
 83     huffmancode hc;
 84     huffmantree ht;
 85     int n,t,i=0,j,l,r,len;
 86     int *b;
 87     float num=0;
 88     gets(s);
 89     t=strlen(s);
 90     b=(int *)malloc(27*sizeof(int));
 91     while(i<t)
 92     {
 93        if(s[i]>='A'&&s[i]<='Z')
 94             {a[s[i]-64]++;num++;}
 95        if(s[i]>='a'&&s[i]<='z')
 96             {a[s[i]-96]++;num++;}
 97        i++;
 98     }
 99     for(i=1;i<=26;i++)
100     {
101         b[i]=(a[i]/num)*10000;
102         printf("%c: %d %.3f---%d\n",i+96,a[i],a[i]/num,b[i]);
103     }
104     huffmancoding(&ht,&hc,b,26);
105     return 0;
106 }

 

posted @ 2015-05-05 08:39  kingofprank  阅读(161)  评论(0编辑  收藏  举报