#include <bits/stdc++.h>   using namespace std;   const long long MAXN = 1e5 + 7;   const long long INF = 1e9 + 7;   vector<long long> g[MAXN];   bool bad[MAXN];   long long best = -1;   long long besth = -1;   void jfs(long long u, long long parent, long long h) {     if (besth < h) {       best = u;       besth = h;     }     for (long long v : g[u]) {       if (v == parent) continue;       if (bad[v]) continue;       jfs(v, u, h + 1);     }   }   pair<long long, long long> getd(long long u, long long parent, long long h) {     pair<long long, long long> res = {h, u};     for (long long v : g[u]) {       if (v == parent) continue;       if (bad[v]) continue;       pair<long long, long long> nr = getd(v, u, h + 1);       res = max(res, nr);     }     return res;   }   bool go(long long u, long long parent, long long want) {     if (u == want) {       bad[u] = true;       return true;     }     for (long long v : g[u]) {       if (v == parent) continue;       if (go(v, u, want)) {         bad[u] = true;         return true;       }     }     return false;   }   long long dist[MAXN];   void calc(long long u, long long parent, long long h) {     dist[u] = h;     for (long long v : g[u]) {       if (v == parent) continue;       if (bad[v]) continue;       calc(v, u, h + 1);     }   }   long long l[MAXN], r[MAXN], par[MAXN], pos[MAXN];   vector<long long> e;   void build(long long u, long long parent) {     par[u] = parent;     pos[u] = e.size();     e.push_back(u);     l[u] = e.size();     for (long long v : g[u]) {       if (v == parent) continue;       build(v, u);     }     r[u] = e.size() - 1;   }   pair<long long, long long> tree[MAXN * 4];   long long add[MAXN * 4];   void buildt(long long v, long long tl, long long tr) {     if (tl == tr) {       tree[v] = {dist[e[tl]], e[tl]};       return;     }     long long tm = (tl + tr) / 2;     buildt(v * 2 + 1, tl, tm);     buildt(v * 2 + 2, tm + 1, tr);     tree[v] = max(tree[v * 2 + 1], tree[v * 2 + 2]);   }   void push(long long v) {     tree[v * 2 + 1].first += add[v];     add[v * 2 + 1] += add[v];     tree[v * 2 + 2].first += add[v];     add[v * 2 + 2] += add[v];     add[v] = 0;   }   void relax(long long v) { tree[v] = max(tree[v * 2 + 1], tree[v * 2 + 2]); }   void upd(long long v, long long tl, long long tr, long long l, long long r,            long long x) {     if (tr < l || r < tl) return;     if (l <= tl && tr <= r) {       tree[v].first += x;       add[v] += x;       return;     }     long long tm = (tl + tr) / 2;     push(v);     upd(v * 2 + 1, tl, tm, l, r, x);     upd(v * 2 + 2, tm + 1, tr, l, r, x);     relax(v);   }   void del(long long v, long long tl, long long tr, long long p) {     if (tl == tr) {       tree[v].first = -INF;       return;     }     long long tm = (tl + tr) / 2;     push(v);     if (p <= tm) {       del(v * 2 + 1, tl, tm, p);     } else {       del(v * 2 + 2, tm + 1, tr, p);     }     relax(v);   }   void make_bad(long long u, long long n) {     bad[u] = true;     del(0, 0, n - 1, pos[u]);     upd(0, 0, n - 1, l[u], r[u], -1);   }   signed main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     long long n;     cin >> n;     if (n == 1) {       cout <<  1 n ;       return 0;     }     for (long long i = 0; i < n - 1; ++i) {       long long u, v;       cin >> u >> v;       g[u - 1].push_back(v - 1);       g[v - 1].push_back(u - 1);     }     pair<long long, long long> t1 = getd(0, 0, 0);     pair<long long, long long> t2 = getd(t1.second, t1.second, 0);     go(t1.second, t1.second, t2.second);     long long curr = t2.first + 1;     cout <<  1   << curr <<    ;     for (long long i = 0; i < n; ++i) dist[i] = -INF;     for (long long i = 0; i < n; ++i) {       if (!bad[i]) continue;       for (long long j : g[i]) {         if (bad[j]) continue;         calc(j, j, 0);       }     }     long long root = t1.second;     build(root, root);     buildt(0, 0, n - 1);     for (long long it = 3; it <= n; ++it) {       if (curr == n) {         for (long long i = 0; i < n - it + 1; ++i) cout << n <<    ;         break;       }       pair<long long, long long> t = tree[0];       curr += t.first + 1;       cout << curr <<    ;       long long u = t.second;       while (!bad[u]) {         make_bad(u, n);         u = par[u];       }     }     cout <<   n ;     return 0;   }