#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct Tree
{
int weight;
int parent, lchild, rchild;
}Tree, *HuffmanTree;
void Select(HuffmanTree HT, int i, int &s1, int &s2)
{//选就小的两个点
int min = 10000;
s1 = 1;
int j,t;
for ( j = 1; j <= i; j++)//选出第一个
{
if (!HT[j].parent&& HT[j].weight < min)//有双亲,就是被选过的不能再次备选
{
min = HT[j].weight;
s1 = j;
t = j;
}
}
min = 1000;
for (int j = 1; j <= i; j++)//选出第二个
{
if (!HT[j].parent&&j!=t && HT[j].weight < min)
{
min = HT[j].weight;
s2 = j;
}
}
}
void createHuffmanTree(HuffmanTree &HT, int n)
{
int m = n * 2-1;
HT = new Tree[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++)
{
int s1, s2;
Select(HT, i-1, s1, s2);
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].weight = HT[s1].weight + HT[s2].weight;
HT[i].lchild = s1;
HT[i].rchild = s2;
}
}
void createHuffmanCode(HuffmanTree &HT, int n)
{
char* cd = new char[n];
cd[n - 1] = '\0';
for (int i = 1; i <= n; i++)
{
int start = n - 1;
int c = i;
int f = HT[i].parent;
for (; f != 0;)
{
--start;
if (HT[f].lchild == c)cd[start] = '0';
else cd[start] = '1';
c = f;
f = HT[f].parent;
}
cout << &cd[start] << endl;
}
}
int main()
{
HuffmanTree HT;
createHuffmanTree(HT, 8);
createHuffmanCode(HT, 8);//这个只能在里面输出,传出去还不会
for (int i = 1; i <16; i++)
{
cout <<i<<" "<< HT[i].weight << " " << HT[i].parent << " " << HT[i].lchild << " " << HT[i].rchild << endl;
}//输出数据
//string a("1234"), b("ds");
//HC.push_back(a);
//HC.push_back(b);
//for (int i = 0; i <8; i++)
// cout << HC[i] << endl;
}