#include <bits/stdc++.h>
using namespace std;
vector<int> sas[100001]; // Tablica sąsiedztwa
bool odw[100001]; //Czy dany wierzchołek był już odwiedzony DFS-em
int wy[100001]; // Wynik dla poddrzewa

void DFS(int v){
	if ((v == 1 && int(sas[v].size()) == 0) || (v != 1 && int(sas[v].size()) == 1)) wy[v] = 1; // Sprawdź, czy jesteś liściem. Jeśli tak, ustaw wynik na 1.
	odw[v] = true;
	for (int syn : sas[v]){
		if (odw[syn] != true){
			DFS(syn); //Po tym, wynik dla syna jest już gotowy
			wy[v] += wy[syn]; //Dodaj wynik poddrzewa syna do wyniku naszego poddrzewa			
		}
	}
}
int main(){
	int n; // n - ilość wierzchołków
	cin>>n;
	for (int i = 2 ; i <= n; i++){
		int ojciec;
		cin>>ojciec;
		sas[ojciec].push_back(i);
		sas[i].push_back(ojciec);
		//Dodajemy ojca do naszych sąsiadów, dodajemy siebie do sąsiadów ojca
	}// Wczytywanie krawędzi
	DFS(1); //Puszczamy DFS dla korzenia
	stable_sort(wy+1, wy+n+1); //Sortujemy tablicę wyników
	for (int i = 1; i < n+1; i++) cout<<wy[i]<<" ";
}
