haffmanTree

  1 /*请在此处编写代码,完成哈夫曼编码,并能输出每个叶子结点的编码*/
  2 /**********  Begin  *********/
  3 
  4 /*请在此处编写代码,完成哈夫曼编码,并能输出每个叶子结点的编码*/
  5 /**********  Begin  *********/
  6 #include <iostream>
  7 using namespace std;
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #define MAX  100000
 11 char a[10]= {'\0'};
 12 struct HtNode {
 13     int data;
 14     int parent,llink,rlink;
 15 };
 16 struct HtTree {
 17     int m;
 18     int root;
 19     struct HtNode *ht;
 20 };
 21 typedef struct HtTree *PHtTree;
 22 
 23 PHtTree fuffman(int m ,int *w)
 24 {
 25     PHtTree pht;
 26     int i,j,x1,x2,m1,m2;
 27     pht=(PHtTree)malloc(sizeof(struct HtNode));
 28     if(pht == NULL)
 29     {
 30         printf("out of space\n");
 31         return pht;
 32     }
 33     pht->ht=(struct HtNode* )malloc(sizeof(struct HtNode)*(2*m-1)) ;
 34     if(pht->ht==NULL)
 35     {
 36         printf("out of space\n");
 37         return pht;
 38     }
 39     for(i=0; i<2*m-1; i++)
 40     {
 41         pht->ht[i].llink=-1;
 42         pht->ht[i].rlink=-1;
 43         pht->ht[i].parent=-1;
 44         if(i<m)pht->ht[i].data=w[i];
 45         else pht->ht[i].data=-1;
 46     }
 47     for(i=0; i<m-1; i++)
 48     {
 49         m1=MAX;
 50         m2=MAX;
 51         x1=-1;
 52         x2=-1;
 53         for(j=0; j<m+i; j++)
 54         {
 55             if(pht->ht[j].data<m1&&pht->ht[j].parent==-1)
 56             {
 57                 m2=m1;
 58                 x2=x1;
 59                 m1=pht->ht[j].data;
 60                 x1=j;
 61             }
 62             else if(pht->ht[j].data<m2&&pht->ht[j].parent==-1)
 63             {
 64                 m2=pht->ht[j].data;
 65                 x2=j;
 66             }
 67         }
 68         pht->ht[x1].parent=m+i;
 69         pht->ht[x2].parent=m+i;
 70         pht->ht[m+i].data=m1+m2;
 71         pht->ht[m+i].llink=x1;
 72         pht->ht[m+i].rlink=x2;
 73     }
 74     pht->root=2*m-2;
 75     return pht;
 76 }
 77 void  print(PHtTree T,int num,int i)
 78 {
 79     if(T->ht[num].rlink==-1&&T->ht[num].llink==-1)
 80     {
 81         printf("%d ",T->ht[num].data);
 82         for(int j=0; j<i; j++)
 83             printf("%c",a[j]);
 84         printf("\n");
 85         return ;
 86     }
 87     a[i]='0';
 88     print(T,T->ht[num].llink,i+1);
 89     a[i]='1';
 90     print(T,T->ht[num].rlink,i+1);
 91 }
 92 int main()
 93 {
 94     int i,m,w[1000];
 95     cin>>m;
 96     for(i=0; i<m; i++)
 97         cin>>w[i];
 98     PHtTree pht=fuffman(m,w);
 99     print(pht,pht->root,0);
100 }
101 
102 /**********  End  *********/
103 
104 
105 /**********  End  *********/
View Code

 

posted @ 2020-12-24 19:40  ethon-wang  阅读(221)  评论(0编辑  收藏  举报