裸的huffuman树,其实可以卜建树,对于新手来说多练吧也是好的
注意优先队列的使用,因为使用动态的。。。。优先队列对指针部分开始怎么也排不了序。后来查了下,发现这个特殊的用法,Mark下
struct cmp { bool operator()(node * a,node * b) { return a->f>b->f; } };
priority_queue<node*,vector<node*>,cmp>pq;
#include <iostream> #include <stdio.h> #include <string.h> #include <queue> #include <stdlib.h> using namespace std; int sum; struct node { int f; node *l; node *r; bool operator <(node *a) { return f>a->f; } }; struct cmp { bool operator()(node * a,node * b) { return a->f>b->f; } }; node *root; void buildTree(int a[]) { priority_queue<node*,vector<node*>,cmp>pq; for(int i=0;i<27;i++) { if(a[i]) { node *n=(node *)malloc(sizeof(node)); n->f=a[i]; n->l=NULL; n->r=NULL; pq.push(n); } } while(pq.size()>1) { node *l=pq.top(); pq.pop(); node *r=pq.top(); pq.pop(); node *p=(node *)malloc(sizeof(node)); p->l=l; p->r=r; p->f=l->f+r->f; pq.push(p); } root=pq.top(); //cout<<root->f<<endl; pq.pop(); } void dfs(node *p,int l) { if(!p->l&&!p->r) { //cout<<l<<endl; sum+=p->f*l; return; } if(p->l)dfs(p->l,l+1); if(p->r)dfs(p->r,l+1); } int main() { //freopen("t.txt","r",stdin); char str[1000]; int a[27],flag; while(scanf("%s",str)!=EOF&&strcmp(str,"END")) { flag=0; //cout<<str<<endl; sum=0; memset(a,0,sizeof(a)); int len=strlen(str); for(int i=0;i<len;i++) { if(str[i]=='_')a[26]++; else a[str[i]-'A']++; } for(int i=0;i<27;i++)if(a[i])flag++; buildTree(a); if(flag==1)sum=len; else dfs(root,0); printf("%d %d %.1lf\n",len*8,sum,len*8*1.0/sum); } return 0; }