func_code_string: #include <bits/stdc++.h>   using namespace std;   inline long long read() {     long long x = 0, f = 1;     char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) {       x = (x << 1) + (x << 3) + (ch ^ 48);       ch = getchar();     }     return x * f;   }   const int N = 100008;   int n;   int x, y;   int nume, head[N];   struct edge {     int to, nxt;   } e[N << 1];   inline void add_edge(int x, int y) {     e[++nume] = (edge){y, head[x]};     head[x] = nume;   }   int ans[N];   int tmp;   int dp[N];   inline void dfs(int x, int fa, int goal) {     int mx1, mx2;     mx1 = mx2 = 0;     for (int i = head[x]; i; i = e[i].nxt) {       int to = e[i].to;       if (to != fa) {         dfs(to, x, goal);         if (dp[to] > mx1) {           mx2 = mx1;           mx1 = dp[to];         } else if (dp[to] > mx2) {           mx2 = dp[to];         }       }     }     if (mx1 + mx2 + 1 >= goal) {       dp[x] = 0;       ++tmp;     } else {       dp[x] = mx1 + 1;     }   }   inline void solve(int l, int r, int ansl, int ansr) {     if (l > r) return;     if (ansl == ansr) {       for (int i = l; i <= r; ++i) {         ans[i] = ansl;       }       return;     }     int mid = (l + r) >> 1;     tmp = 0;     dfs(1, 0, mid);     ans[mid] = tmp;     solve(l, mid - 1, ansl, ans[mid]);     solve(mid + 1, r, ans[mid], ansr);   }   int main() {     n = read();     for (int i = 1; i < n; ++i) {       x = read();       y = read();       add_edge(x, y);       add_edge(y, x);     }     solve(1, n, n, 0);     for (int i = 1; i <= n; ++i) {       printf( %d  , ans[i]);     }     return 0;   }   