您的位置:首页 > 理论基础 > 数据结构算法

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

2015-05-08 14:53 351 查看
/***********************************************

程序:树的存储-----双亲表示法
完成者:小单
完成时间: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: