数据结构:树的存储——双亲表示法

时间:2022-05-27 13:00:03
/***********************************************

			程序:树的存储-----双亲表示法
			完成者:小单
			完成时间:2013年5月20日

***********************************************/
#include <stdio.h>
#define MAX_TREE_SIZE 100
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int TElemType;
typedef int Status;
typedef struct PTNode  //结点结构
{
	TElemType data;
	int parent;  //双亲位置域
}PTNode;

typedef struct //树结构
{
	PTNode nodes[MAX_TREE_SIZE];
	int n;   //树的结点数
}PTree;

Status InitialTree(PTree &T)  //树的初始化
{
	T.n = 0;  //置根的结点数为0
	return OK;
}

Status CreateTree(PTree &T)
{
	printf("请输入结点数:\n");
	scanf("%d",&T.n);
	printf("按编号1-n依次输入结点数值及对应的双亲位置(根结点的双亲请用-1表示):\n");
	for(int i = 0; i < T.n; ++i)
	{
		scanf("%d %d",&T.nodes[i].data, &T.nodes[i].parent);
	}
	return OK;
}

Status FindParentOfNode(PTree &T, TElemType node, TElemType &parent)
{
	//求结点node的双亲
	for(int i = 0; i < T.n; ++i)
	{
		if(T.nodes[i].data == node)
		{
			if(T.nodes[i].parent == -1)
			{
				return FALSE;//根结点无双亲	
			}
			else
			{
				parent = T.nodes[i].parent;//找到双亲,用parent带回
				return TRUE;
			}
		}
	}
	return FALSE;  //无此结点返回
}

Status FindChildOfNode(PTree &T, TElemType node)
{
	//求结点node的孩子
	int count = 0;  //记录孩子的个数
	for(int i = 0; i < T.n; ++i)
	{
		if(T.nodes[i].data == node)
		{
			for(int j = i+1; j < T.n; ++j)//因为我们是按编号1-n的顺序存储的树,所以此时j没必要从0开始
			{
				if(T.nodes[j].parent == i)
				{
					++count;  //找到一个孩子,孩子个数加1
					printf("结点%d的第%d个孩子%d\n", node, count, T.nodes[j]); 
				}

			}
		}
	}
	if(!count)
	{
		return FALSE;//未找到孩子
	}
	printf("总共有%d个孩子\n",count);
	return TRUE;  //找到孩子
}

int main()//测试
{
	PTree T;
	InitialTree(T);
	CreateTree(T);
	TElemType parent;
	TElemType node;
	printf("请输入一个结点:\n");
	scanf("%d",&node);
	if(FindParentOfNode(T,node,parent))
	{
		printf("结点%d的双亲为:%d\n",node,parent);
	}
	printf("\n");
	if(!FindChildOfNode(T,node))
	{
		printf("\n结点%d没有孩子\n",node);
	}
	return 0;
}