自己写的第一个哈夫曼树,纪念一下下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int w;
node *left,*right;
};
node *root,memory[1000];
struct cmp
{
bool operator()(int a,int b)
{
return memory[a].w>memory[b].w;
}
};
int p[27],size,ans;
bool build()//建哈夫曼树
{
priority_queue<int,vector<int>,cmp>q;
size=0;
for(int i=0;i<27;i++)
if(p[i])
{
node *ptr=&memory[size];
ptr->left=ptr->right=NULL;
ptr->w=p[i];
q.push(size);
size++;
}
if(size==1)//只有一种字母(特殊处理)
return false;
while(!q.empty())
{
int min1=q.top();
q.pop();
int min2=q.top();
q.pop();
node *ptr=&memory[size];
ptr->left=&memory[min1];
ptr->right=&memory[min2];
ptr->w=memory[min1].w+memory[min2].w;
root=ptr;
if(!q.empty())
q.push(size);
size++;
}
}
void dfs_tree(node *p,int depth)//遍历数
{
if(p->left==NULL&&p->right==NULL)
{
ans+= depth*p->w;
return;
}
dfs_tree(p->left,depth+1);
dfs_tree(p->right,depth+1);
}
int main()
{
char s[10000],len;
while(gets(s))
{
if(strcmp(s,"END")==0)
break;
memset(p,0,sizeof(p));
len=0;
while(s[len])
{
if(s[len]=='_')
p[26]++;
else
p[s[len]-'A']++;
len++;
}
if(!build())
{
printf("%d %d 8.0\n",len*8,len);
continue;
}
ans=0;
dfs_tree(root,0);
printf("%d %d %.1lf\n",len*8,ans,len*8.0/ans);
}
return 0;
}