求树的最低一层中节点的个数
算法思想:
首先遍历整棵树,将每个叶子节点所在的层数记录下来放到一个数组中,则数组中最大值出现的次数便是树的最低一层中节点的个数
#include<stdio.h>
#define maxsize 100
typedef struct PTNode
{
char data;
int parent;
}PTNode;//树的节点类型
typedef struct PTree
{
PTNode Tnode[maxsize];
int n;//树的节点个数
}PTree;//树
typedef struct Level
{
int index;
int level;
}Level;
PTree CreatePTree();
int nodes(PTree );
//建树
PTree CreatePTree()
{
int i,n;
int 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;
}
//求树的最低一层节点的个数
int nodes(PTree pt)
{
int i,j,k,t=0,count,ns;
Level a[maxsize];
int max;
PTNode p;
for(i=0;i<pt.n;i++)
{
j=i;
//找出叶子节点
for(k=0;k<pt.n;k++)
{
if(pt.Tnode[k].parent==j)
break;
}
//确定叶子节点所在的层次
if(k==pt.n)
{
a[t].index=j;
p=pt.Tnode[j];
count=1;
while(p.parent!=-1)
{
count++;
p=pt.Tnode[p.parent];
}
a[t].level=count;
t++;
}
}
ns=0;
max-=1;
for(i=0;i<t;i++)
{
if(a[i].level>max)
max=a[i].level;
}
for(i=0;i<t;i++)
{
if(a[i].level==max)
ns++;
}
return ns;
}
int main(void)
{
int count;
PTree newTree = CreatePTree();
count = nodes(newTree);
printf("最低一层中的节点个数为:%d个\n",count);
return 0;
}