选取最小的两个节点(根节点即无父节点)作为左右子树建立新节点
重复上述操作 直到只剩一个根节点
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
int data;
int parent,lchild,rchild;
} HTree;
void chazhao(HTree t[],int k,int *s1,int *s2)
{
int i;
for(i=1;i<k&&t[i].parent!=0;i++)
{
}
*s1=i;
for(i=1;i<k;i++) //找最小的s1
{
if(t[i].data<t[*s1].data&&!t[i].parent)
*s1=i;
}
for(i=1;i<k;i++)
{
if(!t[i].parent&&i!=*s1)
break;
}
*s2=i;
for(i=1;i<k;i++) //找最小的s2
{
if(t[i].data<t[*s2].data&&!t[i].parent&&i!=*s1)
*s2=i;
}
}
void build(HTree t[],int n)
{
int m;
m=2*n-1;
for(int i=1; i<=m; i++)
{
t[i].parent=t[i].lchild=t[i].rchild=0;
}
int s1,s2;
for(int i=n+1; i<=m; i++) //依次找出最小的两个建立新节点
{
chazhao(t,i-1,&s1,&s2);
t[s1].parent=t[s2].parent=i;
t[i].lchild=s1;
t[i].rchild=s2;
t[i].data=t[s1].data+t[s2].data;
}
}
int main()
{
int n;
scanf("%d",&n);
HTree t[20020];
for(int i=1;i<=n;i++)
scanf("%d",&t[i].data);
build(t,n);
return 0;
}