#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mmod = 998244353;
#define vl vector<long long>
#define vll vector<vector<long long>>
#define pl pair<long long, long long>
#define vb vector<bool>
vll graf;
vl depth;
ll root = -1;
vl sizes;
vl tour;
vl vyskyt;
vl tree;
void dfs1 (ll v, ll p){
ll s = 1;
for (auto x: graf[v]){
if (x != p){
dfs1(x, v);
s += sizes[x];
}
}
sizes[v] = s;
ll n = graf.size();
if (s*2 >= n && root == -1){
root = v;
}
}
void dfs2 (ll v, ll p, ll d){
ll s = 1;
for (auto x: graf[v]){
if (x != p){
dfs2(x, v, d+1);
s += sizes[x];
}
}
sizes[v] = s;
depth[v] = d;
}
void gettour(ll v, ll p){
tour.push_back(v);
for (auto x : graf[v]){
if (x != p){
gettour(x, v);
tour.push_back(v);
}
}
}
void build(ll l, ll r, ll i){
if (l == r){
if (l < tour.size()){
tree[i] = depth[tour[l]];
}
return;
}
ll mid = (l+r)/2;
build(l ,mid, 2*i);
build(mid+1,r,2*i+1);
tree[i] = min(tree[2*i], tree[2*i+1]);
return;
}
ll query(ll l, ll r, ll L, ll R, ll i){
if (L <= l && r <= R){
return tree[i];
}
if (r < L || R < l){
return 2e18;
}
ll mid = (l+r)/2;
ll a = query(l, mid, L, R, 2*i);
ll b = query(mid+1, r, L, R, 2*i+1);
return min(a,b);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n;
cin >>n;
graf.resize(n);
for (ll i = 0; i <n-1; i++){
ll a,b;
cin >> a >>b;
a--; b--;
graf[a].push_back(b);
graf[b].push_back(a);
}
sizes.resize(n ,0);
dfs1(0, -1);
depth.resize(n, 0);
sizes.clear(); sizes.resize(n, 0);
dfs2(root, -1, 0);
gettour(root, -1);
vyskyt.resize(n , -1);
for (ll i = 0; i < tour.size(); i++){
if (vyskyt[tour[i]] == -1){
vyskyt[tour[i]] = i;
}
}
ll k = 1;
while (k < tour.size()){
k *= 2;
}
tree.resize(4*k+4, 0);
build(0, k-1, 1);
vector<pl> q;
for (ll i = 0; i < n; i++){
q.push_back({sizes[i], i});
}
sort(q.begin(), q.end()); reverse(q.begin(), q.end());
vl ans(n+1, 0);
ll d = 0;
ll u = root; ll v = root;
ll j = 0;
for (ll i = n; i>=1; i--){
if (i % 2 == 1){
ans[i] = 1;
}
else{
while (j < q.size() && q[j].first >= i/2){
ll prvek = q[j].second;
j++;
ll a,b;
a = min(vyskyt[u], vyskyt[prvek]); b = max(vyskyt[u], vyskyt[prvek]);
ll lca1 = query(0, k-1, a , b, 1);
ll d1 = depth[prvek] + depth[u] - 2*lca1;
a = min(vyskyt[v], vyskyt[prvek]); b = max(vyskyt[v], vyskyt[prvek]);
ll lca2 = query(0, k-1, a, b, 1);
ll d2 = depth[prvek] + depth[v] - 2*lca2;
if (d1 < d2){
swap(d1, d2);
swap(u, v);
}
if (d1 > d){
d = d1;
v = prvek;
}
}
ans[i] = d+1;
}
}
for (ll i = 1; i<= n; i++){
cout << ans[i] << "\n";
}
return 0;
}