#include
#include
using namespace std;
struct Node{
char c;
int value;
int par;
char tag; //tag='0',表示左边;tag='1',表示右边
bool isUsed; //判断这个点是否已经用过
Node(){
par=-1;
isUsed=false;
}
};
int input(Node*,int); //输入节点信息
int buildedTree(Node*,int); //建哈夫曼树
int getMin(Node*,int); //寻找未使用的,具有最小频率值的节点
int outCoding(Node*,int); //输出哈夫曼编码
int main ()
{
int n;
cin>>n;
Node *nodes=new Node[2*n-1];
input(nodes,n);
buildedTree(nodes,n);
outCoding(nodes,n);
delete(nodes);
return 0;
}
int input(Node* nodes,int n){
for(int i=0;i
cin>>(nodes+i)->c;
cin>>(nodes+i)->value;
}
return 0;
}
int buildedTree(Node* nodes,int n){
int last=2*n-1;
int t1,t2;
for(int i=n;i
t1=getMin(nodes,i);
t2=getMin(nodes,i);
(nodes+t1)->par=i; (nodes+t1)->tag='0';
(nodes+t2)->par=i; (nodes+t2)->tag='1';
(nodes+i)->value=(nodes+t1)->value+(nodes+t2)->value;
}
return 0;
}
int getMin(Node* nodes,int n){
int minValue=10000000;
int pos=0;
for(int i=0;i
{
if((nodes+i)->isUsed == false && (nodes+i)->value
minValue=(nodes+i)->value;
pos=i;
}
}
(nodes+pos)->isUsed=true;
return pos;
}
int outCoding(Node* nodes,int n){
char a[100];
int pos,k,j;
char tmp;
for(int i=0;i
k=0;
pos=i;
memset(a,'\0',sizeof(a));
while((nodes+pos)->par!=-1){
a[k++]=(nodes+pos)->tag;
pos=(nodes+pos)->par;
}
strrev(a); //翻转字符串
cout<c<value<
}
return 0;
}