#include <iostream>
#include <string.h>
using namespace std;
#define N 1000
struct HufmTree//哈夫曼树
{
charch;//结点字符
intweight;//结点的权值
intparent,lchild,rchild;
};
struct HuffmanCode
{
char ch;
charbits[N+1];
};
HufmTree tree[N];//哈夫曼树
HuffmanCode h[N];//哈夫曼编码
void select(HufmTree tree[],int n,int&min1,int &min2)
//选出parent 的值为0且权值最小的两个结点
{
intmw1=100000,mw2=100000;
for(int i=1;i<=n;i++)
{
if(tree[i].parent!=0)continue;
if(tree[i].weight<=mw1)
{
mw2=mw1;
mw1=tree[i].weight;
min2=min1;
min1=i;
}
else
if(tree[i].weight<mw2)
{
mw2=tree[i].weight;
min2=i;
}
}
}
void CreatHuffman(HufmTree *tree,int n)//n为结点个数
{
if(n<=1)return;
intm=2*n;
for(int i =1;i<m;i++)//初始化结点
{
tree[i].parent=0;
tree[i].lchild=0;
tree[i].rchild=0;
tree[i].weight=0;
}
for(int i=1;i<=n;i++)//读入结点
{
cin>>tree[i].ch;
cin>>tree[i].weight;
}
for(int i=n+1;i<m;i++)
{
int min1,min2;//min1,min2,保存权值最小的两个结点的下标
select(tree,i-1,min1,min2);
tree[min1].parent=i;tree[min2].parent=i;
tree[i].lchild=min1;tree[i].rchild=min2;
tree[i].weight= tree[min1].weight + tree[min2].weight ;
}
}
void HuffmanCoding(HufmTree *tree,HuffmanCode*h,int n)//n为结点个数
{
intc,p;
intstart;
char cd[n+1];
cd[n]='\0';
for(inti=1;i<=n;i++)
{
h[i].ch=tree[i].ch;
start = n;
c=i;
p=tree[c].parent;
while(p==tree[c].parent)
{
if(tree[p].lchild==c)// 如果tree[c]是tree[p]的左孩子,则生成代码‘0’
cd[--start]='0';
else
cd[--start]='1';
c=p;
if(p==2*n-1)break;
else p=tree[p].parent;
}
for(int j=start;j<=n;j++)
{
h[i].bits[j-start]=cd[j];
}
}
}