Huffman编码是之前一道算法作业题,最近又要复习考试了,先把这个的代码再看一下吧。
算法原理很简单,使用优先队列将两个节点弹出,然后合并节点之后再入队列如此循环做下去即可。
主要问题在于树的修改问题,出队的树进行修改,然后将其合并成为一个新的树,在弹出的时候,树的两个节点地址已定,但是由于循环这两个地址会进行修改,所以单独写了一个函数用来进行树的复制。
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 #include<string.h> 5 #include<queue> 6 using namespace std; 7 typedef struct tree{ 8 struct tree *left; 9 struct tree *right; 10 int data; 11 }Tree; 12 13 struct cmp 14 { 15 bool operator()(const Tree &t1,const Tree &t2) 16 { 17 return t1.data>t2.data; 18 } 19 }; 20 int a[8]={1,1,2,5,3,8,13,21};//乱序 21 int code[10]={0}; 22 int m=0; 23 void printhuffman(Tree *huffman) 24 { 25 if(huffman->left!=NULL) 26 { 27 code[m]=0;m++; 28 printhuffman(huffman->left); 29 m--; 30 } 31 if(huffman->right!=NULL) 32 { 33 code[m]=1;m++; 34 printhuffman(huffman->right); 35 m--; 36 } 37 if(huffman->left==NULL&&huffman->right==NULL) 38 { 39 printf("The code of frequency is %3d :",huffman->data); 40 for(int i=0;i<m;i++) 41 printf("%d ",code[i]); 42 printf(" "); 43 return ; 44 } 45 } 46 void copytree(Tree **a,Tree *b) 47 { 48 *a=new Tree(); 49 if(b->left==NULL&&b->right==NULL) 50 { 51 (*a)->left=NULL;(*a)->right=NULL; 52 (*a)->data=b->data; 53 return; 54 } 55 if(b->left!=NULL) 56 { 57 (*a)->left=b->left; 58 copytree(&((*a)->left),b->left); 59 } 60 (*a)->data=b->data; 61 if(b->right!=NULL) 62 { 63 (*a)->right=b->right; 64 copytree(&((*a)->right),b->right); 65 } 66 67 } 68 int main() 69 { 70 int n=8; 71 priority_queue<Tree,vector<Tree>,cmp> minnode; 72 Tree huffman; 73 74 for(int i=0;i<n;i++) 75 { 76 Tree *newtree=new Tree(); 77 newtree->data=a[i]; 78 newtree->left=NULL; 79 newtree->right=NULL; 80 minnode.push(*newtree); 81 } 82 while(minnode.size()>=2) 83 { 84 Tree temp1=minnode.top();minnode.pop(); 85 Tree temp2=minnode.top();minnode.pop(); 86 Tree *temp3=new Tree(); 87 temp3->left=NULL; 88 temp3->right=NULL; 89 temp3->data=0; 90 copytree(&temp3->left,&temp1); 91 copytree(&temp3->right,&temp2); 92 temp3->data=(*(temp3->left)).data+(*(temp3->right)).data; 93 minnode.push(*temp3); 94 } 95 huffman=minnode.top(); 96 printhuffman(&huffman); 97 return 0; 98 }
运行结果: