数据结构二叉树
#include<stdio.h>
struct node{
int weight; //权值
int parent; //双亲节点
int lchild,rchild; //左孩子右孩子
};
main()
{
struct node ht[1000];
int w[1000]; //权值
int n; //共几个叶子节点
int i,j,x1,x2,m1,m2; //x求剩余的最小权值,m权值下标
printf("\ninput:节点个数n:");
scanf("%d",&n); //输入叶子节点的个数
printf("\ninput:叶子的权值yuezi:");
for(i=0;i<n;i++)
scanf("%d",&w[i]); //获取值权值,暂时存放w数组中
for(i=0;i<n;i++)
{
ht[i].weight=w[i]; //权值复制
ht[i].parent=-1; //没有参与
ht[i].lchild=-1;
ht[i].rchild=-1;
}
for(i=0;i<n-1;i++) //i<=n-2;i++
{
x1=x2=100; //和x1x2比较找最小值,次小值
m1=m2=-1; //最小值,次小值 权值下标
for(j=0;j<n+i;j++)
{
if(ht[j].parent==-1 && ht[j].weight<x1)
{
x2=x1;
m2=m1;
x1=ht[j].weight; //最小值
m1=j; //权值下标
}else if(ht[j].parent==-1 && ht[j].weight<x2)
{
x2=ht[j].weight;
m2=j;
}
}
ht[n+i].weight=ht[m1].weight+ht[m2].weight; //x1+x2
ht[n+i].parent=-1; //有没有使用过
ht[n+i].lchild=m1; //下标
ht[n+i].rchild=m2;
ht[m1].parent=n+i;
ht[m2].parent=n+i;
}
for(i=0;i<2*n-1;i++) //输出
{
printf("\n");
printf("\nht[%d].weight=%d",i,ht[i].weight);
printf("\nht[%d].parent=%d",i,ht[i].parent);
printf("\nht[%d].lchild=%d",i,ht[i].lchild);
printf("\nht[%d].rchild=%d",i,ht[i].rchild);
}
}
本文来自博客园,作者:JackieDYH,转载请注明原文链接:https://www.cnblogs.com/JackieDYH/p/17634987.html