#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 2;
vector<int> adj[N];
int now = 0, now1 = 0, level[N], shit[N], ans;
set<pair<int, int> > lis;
void dfs(int x, int p, bool wow) {
  if (!wow) {
    if (level[x] > level[now]) {
      now = x;
    }
  } else {
    if (level[x] > level[now1]) {
      now1 = x;
    }
  }
  for (int i = 0; i < adj[x].size(); i++) {
    if (adj[x][i] != p) {
      level[adj[x][i]] = level[x] + 1;
      dfs(adj[x][i], x, wow);
      if (wow) {
        shit[x] = max(shit[x], shit[adj[x][i]] + 1);
      }
    }
  }
  if (wow) {
    lis.insert({shit[x], x});
  }
}
void erasee(int x) {
  int idxmax = 0;
  for (int i = 0; i < adj[x].size(); i++) {
    if (shit[adj[x][i]] > shit[idxmax] && shit[adj[x][i]] < shit[x]) {
      idxmax = adj[x][i];
    }
  }
  ans++;
  lis.erase({shit[x], x});
  if (!idxmax) {
    return;
  }
  erasee(idxmax);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, i, j, k, l;
  cin >> n;
  for (i = 1; i < n; i++) {
    cin >> j >> k;
    adj[j].push_back(k);
    adj[k].push_back(j);
  }
  shit[0] = -1;
  cout << 1 << ' ';
  dfs(1, 1, false);
  level[now] = 0;
  dfs(now, now, true);
  set<pair<int, int> >::iterator ite;
  erasee(now);
  cout << ans << ' ';
  for (i = 3; i <= n; i++) {
    if (!lis.size()) {
      cout << ans << ' ';
      continue;
    }
    ite = lis.end();
    ite--;
    j = ite->second;
    erasee(j);
    cout << ans << ' ';
  }
}
