#include <bits/stdc++.h>
using namespace std;
const int MN = 4005;
int n;
bool rem[MN];
int sz[MN], deg[MN];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> leaves;
vector<vector<int>> tree;
pair<int, int> max_dis(int node, int prev = 0) {
if (rem[node]) return {-10, -10};
pair<int, int> cand = {node, 1};
for (auto next: tree[node]) {
if (next == prev) continue;
pair<int, int> might = max_dis(next, node);
might.second++;
if (might.second > cand.second) cand = might;
}
return cand;
}
int get_diam() {
int st = -1;
for (int i = 1; i <= n; i++) {
if (!rem[i]) st = i;
}
if (st == -1) return 1;
int end1 = max_dis(st).first;
return max_dis(end1).second;
}
void remove_nodes(int b) {
while (!leaves.empty() && leaves.top().first < b) {
int curr = leaves.top().second;
rem[curr] = true;
leaves.pop();
for (auto next: tree[curr]) {
if (rem[next]) continue;
sz[next] += sz[curr];
deg[next]--;
if (deg[next] == 1) {
leaves.push({sz[next], next});
}
}
}
}
void solve() {
cin >> n;
tree.resize(n+1);
for (int i = 1; i < n; i++) {
int u, v; cin >> u >> v;
tree[u].push_back(v);
tree[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
sz[i] = 1;
deg[i] = tree[i].size();
}
for (int i = 1; i <= n; i++) {
if (deg[i] == 1) leaves.push({sz[i], i});
}
int diam = get_diam();
for (int k = 1; k <= n; k++) {
if (k & 1) {
cout << 1 << "\n";
}
else {
remove_nodes(k / 2);
int ans = get_diam();
cout << ans << "\n";
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
return 0;
}