#include <iostream>
using namespace std;
struct HuffmanTree
{
int weight;
int parent,lchild,rchild;
};
void CreateHuffmanTree(HuffmanTree *&HT,int n)
{
int m;
m=2*n-1; //节点个数
HT=new HuffmanTree[m+1];
for(int i=1;i<m;i++)
{
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=1;i<=n;i++)
{
cin>>HT[i].weight;//输入前N个单元中叶子节点的权值
}
for(i=n+1;i<=m;i++)//创建哈弗曼树(通过N-1次选择,删除,合并来创建哈夫曼树)
{
int v1=0,v2=0;
int *a1=&v1,*a2=&v2;
void Select(HuffmanTree *HT,int j,int *m,int *n);//选择节点函数声明
Select(HT,i-1,a1,a2);
int s1=*a1,s2=*a2;
HT[s1].parent=i;
HT[s2].parent=i;//得到新节点i,从森林中删除s1,s2,将s1和s2的双亲域由0改为1
HT[i].lchild=s1;
HT[i].rchild=s2;//s1,s2分别作为i的左右孩子
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
}
void Select(HuffmanTree *HT,int j,int *m,int *n)//选择函数。在HT[k]中选择两个双亲域为0且权值最小的节点,并返回它们在HT中的序号a1,a2
{
for(int k=1;k<=j;j++)
{
for(int w=k+1;w<=j;w++)
{
if(HT[k].parent==0&&HT[w].parent==0&& )