//
// Created by liasa on 22/03/2026.
//
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define v vector
#define lp(i, s, e) for (ll i = s; i < e; ++i)
#define pll pair<ll, ll>
#define tpl tuple<ll, ll, ll>
// bl,dsu,edges
ll logi = 20;
ll n;
v<v<pll>> g;
v<v<ll>> bl;
v<ll> dep, sz, eg_e;
v<tpl> edges;
void dfs(ll node, ll par, ll d) {
dep[node] = d;
sz[node] = 1;
for (auto [it, eg] : g[node]) {
if (it != par) {
dfs(it, node, d + 1);
bl[it][0] = node;
sz[node] += sz[it];
eg_e[eg] = min(sz[it], n - sz[it]);
}
}
}
void build_bl() {
lp(j, 1, logi) {
lp(i, 0, n) { bl[i][j] = bl[bl[i][j - 1]][j - 1]; }
}
}
ll find(ll a, ll b) {
if (a == b)
return a;
if (dep[a] > dep[b])
swap(a, b);
ll dif = dep[b] - dep[a];
lp(j, 0, logi) {
if ((1LL << j) & dif) {
b = bl[b][j];
}
}
if (a == b)
return a;
for (ll j = logi - 1; j >= 0; --j) {
if (bl[a][j] != bl[b][j]) {
a = bl[a][j], b = bl[b][j];
}
}
a = bl[a][0];
return a;
}
ll dist(ll a, ll b) {
ll lca = find(a, b);
return (dep[a] + dep[b] - 2 * dep[lca]);
}
struct Dsu {
v<ll> par;
v<pair<ll, pll>> diam;
ll sol = 0;
Dsu() {
par.resize(n);
iota(par.begin(), par.end(), 0);
diam.resize(n);
for (ll i = 0; i < n; i++)
diam[i] = {0, {i, i}};
}
ll find(ll e) {
if (par[e] == e)
return e;
return par[e] = find(par[e]);
}
void uni(ll a, ll b) {
ll x = find(a), y = find(b);
if (x == y)
return;
diam[x] = max(diam[x], {{dist(x, y)}, {x, y}});
par[y] = x;
diam[x] = max(diam[x], diam[y]);
v<ll> f = {diam[x].second.first, diam[x].second.second};
v<ll> s = {diam[y].second.first, diam[y].second.second};
for (auto A : f) {
for (auto B : s) {
diam[x] = max(diam[x], {dist(A, B), {A, B}});
}
}
sol = max(sol, diam[x].first);
}
};
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
g.resize(n);
bl.resize(n, v<ll>(logi));
dep.resize(n);
sz.resize(n);
eg_e.resize(n - 1);
edges.resize(n - 1);
lp(i, 0, n - 1) {
ll a, b;
cin >> a >> b;
a--;
b--;
edges[i] = {i, a, b};
g[a].push_back({b, i});
g[b].push_back({a, i});
}
dfs(0, -1, 0);
build_bl();
lp(i, 0, n - 1) { get<0>(edges[i]) = eg_e[i]; }
sort(edges.begin(), edges.end());
reverse(edges.begin(), edges.end());
Dsu dsu;
v<ll> ans(n);
ll idx = 0;
for (ll i = n - 1; i >= 0; --i) {
if (!(i & 1))
ans[i] = 1;
else {
while (idx < n - 1) {
auto [c, a, b] = edges[idx];
if (c < (i + 1) / 2)
break;
dsu.uni(a, b);
idx++;
}
ans[i] = dsu.sol + 1;
}
}
lp(i, 0, n) cout << ans[i] << '\n';
}