要加 #include <cstring>
//算法5.11 根据赫夫曼树求赫夫曼编码
#include<iostream>
#include <cstring>
using namespace std;
typedef struct
{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void Select(HuffmanTree HT,int len,int &s1,int &s2)
{
/**************************Begin*********************/
int cnt = 0;
for(int i = 1;i <= len;i ++ )
if(HT[i].parent == 0)
{
if(cnt == 0) s1 = i,cnt ++ ;
else if(cnt == 1)
{
s2 = i,cnt ++ ;
if(HT[s1].weight > HT[s2].weight)
{
int temp = s1;
s1 = s2;
s2 = temp;
}
}
else
{
if(HT[i].weight < HT[s1].weight) s2 = s1,s1 = i;
else if(HT[i].weight < HT[s2].weight) s2 = i;
}
}
/**************************End************************/
}
//用算法5.10构造赫夫曼树
void CreatHuffmanTree(HuffmanTree &HT,int n)
{
//构造赫夫曼树HT
/************************Begin*********************/
int s1,s2;
if(n <= 1) return ;
int m = 2 * n - 1;
HT = new HTNode[m + 1];
for(int i = 1;i <= m;i ++ )
{
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
for(int i = 1;i <= n;i ++ ) cin >> HT[i].weight;
for(int i = n + 1;i <= m;i ++ )
{
Select(HT,i - 1,s1,s2);
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
/*************************End******************************/
}
// CreatHuffmanTree
void CreatHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n)
{
//从叶子到根逆向求每个字符的赫夫曼编码,存储在编码表HC中
/************************Begin*********************/
HC = new char*[n + 1];
char *cd = new char[n];
cd[n - 1] = '\0';
for(int i = 1;i <= n;i ++ )
{
int start = n - 1;
int c = i,f = HT[i].parent;
while(f)
{
-- start ;
if(HT[f].lchild == c) cd[start] = '0';
else cd[start] = '1';
c = f;f = HT[f].parent;
}
HC[i] = new char [n - start];
strcpy(HC[i],&cd[start]);
}
delete cd;
/************************End**********************/
} // CreatHuffanCode
void show(HuffmanTree HT,HuffmanCode HC)
{
for(int i=1;i<=sizeof(HC);i++)
cout << HC[i]<< endl;
}
int main()
{
HuffmanTree HT;
HuffmanCode HC;
int n;
cin>>n; //输入赫夫曼树的叶子结点个数
CreatHuffmanTree(HT,n);
CreatHuffmanCode(HT,HC,n);
show(HT,HC);
return 0;
}