思路:
1.
先建树
比如利用 vector<vector<int>> v;
v[node].size() 即为叶子的判别条件
2.
利用bfs逐层判断节点是否为叶子节点,若是则level数组对应的位置加一
3.
求出深度并打印
#include <cstdio> #include <vector> #include <queue> #include <cstring> #include <algorithm> using namespace std; vector<vector<int>> v; int n,m; queue<int> q; int level[100]; int mh=0; void bfs(int l) { while(q.empty() != true) { int newnode=q.front(); //pop并不会返回元素 q.pop(); if(v[newnode].size() == 0) { level[l]++; continue; } for(int i =0;i<v[newnode].size();i++) { q.push(v[newnode][i]); bfs(l+1); } } } int gethigh(int h,int node){ if(v[node].size() == 0) mh=max(h,mh); for(int i =0;i<v[node].size();i++) { gethigh(h+1,v[node][i]); } } int main() { scanf("%d %d",&n,&m); v.resize(n+1); memset(level,0,100); //建树 for(int i=0;i<m;i++) { int id,k; scanf("%d %d",&id,&k); for(int j =0;j<k;j++) { int ch; scanf("%d",&ch); v[id].push_back(ch); } } q.push(1); bfs(0); gethigh(0,1); // printf("mh:%d\n",mh); for(int i=0;i<=mh;i++) { i == 0? printf("%d",level[i]):printf(" %d",level[i]); } return 0; }