#include <bits/stdc++.h>
using namespace std;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
// fix a line
// count #left, #right, take min, times 2
int n;
cin >> n;
vector<vector<int>> adj(n + 1);
for (int i = 0, u, v; i < n - 1; ++i) {
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> par(n + 1), tin(n + 1), tout(n + 1), subtree_sz(n + 1);
int timer = 0;
auto dfs = [&](auto &&self, int u, int p) -> void {
par[u] = p;
tin[u] = timer++;
subtree_sz[u] = 1;
for (int &i : adj[u]) {
if (i != p) {
self(self, i, u);
subtree_sz[u] += subtree_sz[i];
}
}
tout[u] = timer - 1;
};
dfs(dfs, 1, 0);
vector dist(n + 1, vector<int>(n + 1));
auto sssp = [&](int u) {
queue<int> q;
vector<bool> vis(n + 1);
q.push(u);
vector<int> ans(n + 1, n);
ans[u] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
if (vis[u]) {
continue;
}
vis[u] = true;
for (int &i : adj[u]) {
if (ans[u] + 1 < ans[i]) {
ans[i] = ans[u] + 1;
q.push(i);
}
}
}
return ans;
};
for (int i = 1; i <= n; ++i) {
dist[i] = sssp(i);
}
vector<int> ans(2 * n + 1, 1);
auto process_line = [&](int u, int v) {
int d = dist[u][v];
if (tin[u] > tin[v]) {
swap(u, v);
}
if (tin[u] <= tin[v] && tin[v] <= tout[u]) {
// go 1 down on u
for (int &i : adj[u]) {
if (i == par[u]) {
continue;
}
if (tin[i] <= tin[v] && tin[v] <= tout[i]) {
u = i;
break;
}
}
int size = min(subtree_sz[v], n - subtree_sz[u]);
ans[2 * size] = max(ans[2 * size], d + 1);
} else {
int size = min(subtree_sz[u], subtree_sz[v]);
ans[2 * size] = max(ans[2 * size], d + 1);
}
};
for (int i = 1; i <= n; ++i) {
for (int j = 1; j < i; ++j) {
process_line(i, j);
}
}
for (int i = 1; i <= n; ++i) {
cout << ans[i] << '\n';
}
}