数据结构二叉树

#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);
	}

}

 

posted @ 2019-09-30 09:24  JackieDYH  阅读(3)  评论(0编辑  收藏  举报  来源