#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode {
int weight;
int parent;
int left;
int right;
}TreeNdoe;
typedef struct HFTree {
TreeNdoe* data;
int size;
}HFTree;
HFTree* initTree(int*data,int size) {
HFTree* T = (HFTree*)malloc(sizeof(HFTree));
T->data = (TreeNdoe*)malloc(sizeof(TreeNode) * (size * 2 - 1));
T->size = size;
for (int i = 0; i < size; i++)
{
T->data[i].weight = data[i];
T->data[i].parent = 0;
T->data[i].left = -1;
T->data[i].right = -1;
}
return T;
}
int* selectMin(HFTree*T) {
int min = 10000;
int secondmin = 10000;
int minindex = -1;
int secondindex = -1;
int length = T->size;
for (int i = 0; i < length; i++)
{
if (T->data[i].parent==0)
{
if (T->data[i].weight<min)
{
min = T->data[i].weight;
minindex = i;
}
}
}
for (int i = 0; i < length; i++)
{
if (T->data[i].parent==0 && i != minindex)
{
if (T->data[i].weight<secondmin)
{
secondmin = T->data[i].weight;
secondindex = i;
}
}
}
int* res = (int*)malloc(sizeof(int) * 2);
res[0] = minindex;
res[1] = secondindex;
return res;
}
void CreatTree(HFTree*T) {
int minindex;
int seconindex;
int* res;
int length = T->size * 2 - 1;
for (int i = T->size; i < length; i++)
{
res = selectMin(T);
minindex = res[0];
seconindex = res[1];
T->data[i].weight = T->data[minindex].weight + T->data[seconindex].weight;
T->data[i].left = minindex;
T->data[i].right = seconindex;
T->data[i].parent = 0;
T->data[minindex].parent = i;
T->data[seconindex].parent = i;
T->size++;
}
}
void preorder(HFTree*T,int index) {
if (index!=-1)
{
printf("%d", T->data[index].weight);
preorder(T, T->data[index].left);
preorder(T, T->data[index].right);
}
}
int main()
{
int data[4] = {1,2,3,4};
HFTree* T = initTree(data, 4);
CreatTree(T);
preorder(T,T->size-1);
return 0;
}
参考: