题意:给一个树,求各层次的叶子节点数量
思路: 直接通过叶子节点向上遍历,数出他是第几层,然后对应层的叶子数量加1.注意要去一下最大层的层数。
还有就是只有1个根节点的话,不视作叶子节点。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<map>
using namespace std;
#define INF 99999999
#define M 200
//start:22:03
//end:22:22
int main()
{
int n,m,i,j,id,childn,child;
int nonleaf[M],father[M];
memset(nonleaf,0,sizeof(nonleaf));
scanf("%d%d",&n,&m);
if(n==1)
{
printf("1\n");
}
for(i=0;i<m;i++)
{
scanf("%d%d",&id,&childn);
nonleaf[id]=1;
for(j=0;j<childn;j++)
{
scanf("%d",&child);
father[child]=id;
}
}
int level,p;
int ans[M];
for(i=0;i<=n;i++)
{
ans[i]=0;
}
int levelmax=0;
for(i=1;i<=n;i++)
{
if(nonleaf[i]==0)
{
p=i;
level=0;
while(p!=1)
{
p=father[p];
level++;
}
ans[level]++;
if(level>levelmax)
{
levelmax=level;
}
}
}
for(i=0;i<=levelmax;i++)
{
if(i!=levelmax)
printf("%d ",ans[i]);
else printf("%d\n",ans[i]);
}
}