思路
这道题思路很简单,题目给出了一棵树,让求每一层的叶子结点数。那么我们用邻接表存树,dfs进行遍历,从根节点出发,走到叶子结点了,那么对应的层数d,ans[d]++.
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 168;
vector<int> g[N];
int ans[N],mx;
//dfs遍历树
void dfs(int p,int d)
{
//取树的最大深度
mx=max(mx,d);
// 走到叶子结点了,那么此时的层数的叶子结点个数加1
if(g[p].size()==0)
{
ans[d]++;
return ;
}
for(int i=0; i<g[p].size(); ++i) dfs(g[p][i],d+1);
}
int main()
{
int n,m;
cin>>n>>m;
//利用邻接表存图模拟
for(int i=0; i<m; ++i)
{
int id,k;
cin>>id>>k;
for(int j=0; j<k; j++)
{
int son;
cin>>son;
g[id].push_back(son);
}
}
dfs(1,0);
for(int i=0; i<=mx; ++i)
{
printf("%d",ans[i]);
if(i!=mx) printf(" ");
}
return 0;
}