首页 > 其他 > 详细

Huffman树编码-优先队列实现

时间:2014-11-14 22:40:48      阅读:339      评论:0      收藏:0      [点我收藏+]

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("\n");
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 }

运行结果:

bubuko.com,布布扣

Huffman树编码-优先队列实现

原文:http://www.cnblogs.com/holyprince/p/4098233.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!