#include <bits/stdc++.h>
using namespace std;
const long long N = 5e5 + 9;
vector<long long> adj[N], vec[N];
long long h[N], up[N], ans[N];
pair<long long, long long> edge[N];
vector<pair<long long, long long> > a[N];
void DFS1(long long u, long long par) {
  h[u] = 1;
  for (long long v : adj[u])
    if (v != par) {
      DFS1(v, u);
      h[u] = max(h[u], h[v] + 1);
      vec[u].push_back(h[v]);
    }
}
void DFS2(long long u, long long par) {
  multiset<long long> s;
  for (long long v : adj[u])
    if (v != par) s.insert(-h[v]);
  for (long long v : adj[u])
    if (v != par) {
      s.erase(s.find(-h[v]));
      up[v] = up[u] + 1;
      if (!s.empty()) up[v] = max(up[v], -(*s.begin()) + 1);
      vec[v].push_back(up[v]);
      s.insert(-h[v]);
    }
  for (long long v : adj[u])
    if (v != par) DFS2(v, u);
}
void DFS3(long long u, long long par) {
  for (long long v : adj[u])
    if (v != par) {
      vector<pair<long long, long long> > b;
      long long iu = 0, iv = 0;
      while (iu < a[u].size() && iv < a[v].size()) {
        if (a[u][iu].first < a[v][iv].first)
          b.push_back(a[u][iu++]);
        else if (a[u][iu].first > a[v][iv].first)
          b.push_back(a[v][iv++]);
        else if (a[u][iu].first == a[v][iv].first)
          b.push_back({a[v][iv].first, a[v][iv++].second + a[u][iu++].second});
      }
      while (iv < a[v].size()) b.push_back(a[v][iv++]);
      while (iu < a[u].size()) b.push_back(a[u][iu++]);
      for (long long i = 0; i < b.size(); i++) {
        if (b[i].first == up[v]) b[i].second--;
        if (b[i].first == h[v]) b[i].second--;
      }
      long long num = 0;
      while (b.size()) {
        ans[b.back().first * 2] =
            max(ans[b.back().first * 2], (num += b.back().second));
        b.pop_back();
      }
      DFS3(v, u);
    }
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  long long n;
  cin >> n;
  for (long long i = 1; i < n; i++) {
    long long u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  fill(ans, ans + N, 1);
  DFS1(1, 0);
  DFS2(1, 0);
  for (long long i = 1; i <= n; i++) {
    sort(vec[i].begin(), vec[i].end());
    for (long long j = 0; j < vec[i].size() - 1; j++)
      if (vec[i][j] != vec[i][j + 1])
        ans[vec[i][j] * 2 + 1] =
            max(ans[vec[i][j] * 2 + 1], (long long)vec[i].size() - j);
    for (long long j = 0; j < vec[i].size(); j++)
      ans[vec[i][j] * 2 - 1] =
          max(ans[vec[i][j] * 2 - 1], (long long)vec[i].size() - j),
                          ans[vec[i][j] * 2] = max(
                              ans[vec[i][j] * 2], (long long)vec[i].size() - j);
    for (long long j = 0, k = 0; max(j, k) < vec[i].size(); j = k) {
      while (k < vec[i].size() && vec[i][j] == vec[i][k]) k++;
      a[i].push_back({vec[i][j], k - j});
    }
  }
  DFS3(1, 0);
  for (long long i = n; i > 0; i--) ans[i] = max(ans[i], ans[i + 2]);
  for (long long i = 1; i <= n; i++)
    ans[1] = max(ans[1], (long long)adj[i].size() + 1);
  for (long long i = 1; i <= n; i++) cout << ans[i] << " ";
  return 0;
}
