哈夫曼树哈夫曼编码
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
typedef struct node{
int w;
struct node*l;
struct node*r;
}node;
string s[N*N];
int sum[N*N];
node q[N*N];
int g[N];
int hh=0,tt=-1;
int n;
void dfs(node *u,string str,int num){
if(!u) return;
if(!u->l&&!u->r){
int x=u->w;
s[x]=str;
sum[x]=num;
return;
}
dfs(u->l,str+'0',num+1);
dfs(u->r,str+'1',num+1);
}
bool cmp(node a,node b){
return a.w<b.w;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
g[i]=x;
q[++tt].w=x;
q[tt].l=q[tt].r=NULL;
}
if(n<=1){
cout<<"error";
return 0;
}
while(hh<tt){
node*a,*b;
sort(q+hh,q+tt+1,cmp);
a=&q[hh];
b=&q[hh+1];
int fa=a->w+b->w;
q[++tt].w=fa;
q[tt].l=a,q[tt].r=b;
hh+=2;
}
int res=0;
dfs(&q[tt],"",0);
for(int i=0;i<n;i++){
printf("%d编码为",g[i]);
cout<<s[g[i]]<<endl;
res+=sum[g[i]]*g[i];
}
cout<<"WPL:"<<res;
}