#include using namespace std; typedef long long ll; typedef long double ld; #define REP(i, N) for(int i=0;i<(N);++i) #define FOR(i, a, b) for(int i=(a);i<=(b);++i) #define FORI(i, a, b) for(int i=(a);i<(b);++i) #define FORD(i, a, b) for(int i=(b)-1;i>=(a);--i) #define MAX 12000 int N; int otec[MAX]; vector syni[MAX]; int pocet[MAX]; void dfs_o(int v, int w) { pocet[v] = 1; int po = -1; REP(i,syni[v].size()) { int x = syni[v][i]; if (x != w) { otec[x] = v; dfs_o(x,v); pocet[v] += pocet[x]; } else { po = i; } } if (po != -1) syni[v].erase(syni[v].begin() + po); } struct SX { vector * VX; bool operator<(const SX& B) const { return VX->size() < B.VX->size(); } }; vector fx(int v) { //printf("cv %d\n", v); vector vys; vector< vector > XX; REP(i,syni[v].size()) { //printf("--%d\n", syni[v][i]); XX.push_back(fx(syni[v][i])); } vys.push_back(v); priority_queue A; REP(i,XX.size()) { SX my; my.VX = &XX[i]; A.push(my); } SX prev; prev.VX = NULL; while (!A.empty()) { SX neco = A.top(); A.pop(); if (neco.VX != prev.VX || A.empty()) { } else { SX dalsi = A.top(); A.pop(); A.push(neco); neco = dalsi; } vector * po = neco.VX; int x = po->back(); vys.push_back(x); po->pop_back(); if (!po->empty()) A.push(neco); prev = neco; } /*bool happened = true; while (happened) { happened = false; REP(i,Vy.size()) { if (!Vy[i].empty()) { vys.push_back(Vy[i][Vy[i].size() - 1]); Vy[i].pop_back(); } } }*/ return vys; } void solve(){ REP(n,N) { otec[n] = -2; pocet[n] = 0; syni[n].clear(); } REP(i,N-1) { int a; scanf("%d", &a); syni[a].push_back(i+1); syni[i+1].push_back(a); } otec[0] = -1; dfs_o(0,-1); vector vv = fx(0); REP(i,vv.size()-1) { printf("%d ", vv[i]); } printf("%d\n", vv[vv.size()-1]); //REP(n,N) printf("v %d: %d o %d\n", n, pocet[n], otec[n]); } int main(){ while(scanf("%d",&N)>0){ solve(); } return 0; }