链接
思路
统计每根节点叶子节点的个数,然后排序
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
int n, cnt;
int head[N], leaf[N];
struct edge{
int to, nxt;
}e[N];
inline void add(int u, int v){
e[++cnt] = {v, head[u]};
head[u] = cnt;
}
void dfs(int u){
int flag = 1;
for (int i = head[u]; ~i; i = e[i].nxt) {
flag = 0;
int v = e[i].to;
dfs(v);
leaf[u] += leaf[v];
}
if (flag) leaf[u] = 1;
}
int main() {
cin >> n;
memset(head, -1, sizeof head);
for (int i = 2, fa; i <= n; ++i) {
cin >> fa;
add(fa, i);
}
dfs(1);
sort(leaf + 1, leaf + 1 + n);
for (int i = 1; i <= n; ++i)
cout << leaf[i] << " ";
return 0;
}