PAT 数叶子节点 (1004) #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 110; int n, m; int h[N], e[N], ne[N], idx;//该地方利用了数组模拟邻接表的原理来构造树,可以多查找相关的表示方法,网上有很多。 int cnt[N], max_depth; void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx ++;//e数组存的是该节点内容 //ne数组表示与a相连的下一个节点而这一切都是由idx所相联系在一起的 } void dfs(int u, int depth) { if(h[u] == -1)//表示该节点没有孩子节点因为以u为链表指向-1 { cnt[depth] ++ ;//cnt数组表示某一层有多少个叶子节点的计数器 max_depth = max(max_depth, depth);//计算最大的树深度 return; } for(int i = h[u]; ~i; i = ne[i]) dfs(e[i], depth + 1); } int main() { cin >> n >> m; memset(h, -1, sizeof h); for(int i = 0; i < m; i ++ ) { int id, k; cin >> id >> k; while(k -- ) { int son; cin >> son; add(id, son); } } dfs(1, 0); cout << cnt[0]; for(int i = 1; i <= max_depth; i ++ ) cout << ' ' << cnt[i];//PAT容易卡结果的空格所以要规范输出 cout << endl; return 0; }```