求出第i层的节点个数,并输出其数据域
算法思想:
在双亲表示法中的节点中增加一个level域,然后对每个节点向上回溯,求出其所在的层数并将其保存在level域中,最后遍历整个树,找出节点的level域和i相等的节点将其数据域输出。
#include<stdio.h>
#define maxsize 100
typedef struct PTNode
{
char data;
int parent;
int level;//为解题方便,给节点增加一个level域
}PTNode;//树的节点类型
typedef struct PTree
{
PTNode Tnode[maxsize];
int n;//树中节点的个数
}PTree;//树
//建树
PTree CreatePTree()
{
int i,n,parentId;
char data;
PTree newTree;
scanf("%d",&n);
newTree.n=n;
getchar();
for(i=0;i<n;i++)
{
scanf("%c %d",&data,&parentId);
newTree.Tnode[i].data=data;
newTree.Tnode[i].parent=parentId;
getchar();
}
return newTree;
}
//求第i层节点的个数,并输出其数据域
void LevelNodes(PTree pt,char *a,int *n,int k)
{
int i,j;
int level;
PTNode p;
for(i=0;i<pt.n;i++)
{
//确定每个节点的层数
level=1;
p=pt.Tnode[i];
while(p.parent!=-1)
{
level++;
p=pt.Tnode[p.parent];
}
pt.Tnode[i].level=level;
}
//遍历数组找到层数和i相等的节点
j=0;
for(i=0;i<pt.n;i++)
{
if(pt.Tnode[i].level==k)
a[j++]=pt.Tnode[i].data;
}
*n=j;
}
int main(void)
{
int i,k,n;
char a[maxsize];
PTree newTree = CreatePTree();
scanf("%d",&k);
LevelNodes(newTree,&a,&n,k);
printf("第%d层的节点个数为%d个,他们分别是:\n",k,n);
for(i=0;i<n;i++)
printf("%c ",a[i]);
printf("\n");
return 0;
}