#include<iostream> #include<algorithm> #include<string.h> using namespace std; typedef long long ll; const int N=1e5+10; int n; int h[N],e[N*2],ne[N*2],idx; int dis[N],d[N]; void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void dfs(int u,int fa) { dis[u]=dis[fa]+1; for(int i=h[u];~i;i=ne[i]) { int j=e[i]; if(j==fa) continue; dfs(j,u); } } int main() { scanf("%d",&n); memset(h,-1,sizeof h); for(int i=0;i<n-1;i++) { int a,b; scanf("%d%d",&a,&b); add(a,b),add(b,a); } dfs(1,1);//得到距离root最远距离的点 int max_d=0,pos; for(int i=1;i<=n;i++) if(max_d<dis[i]) { max_d=dis[i]; pos=i; } dis[pos]=0; dfs(pos,pos);//得到其他点到u的距离 max_d=0; for(int i=1;i<=n;i++) { d[i]=dis[i];//d[i]存其它点到u这个点的距离 if(max_d<d[i]) { max_d=dis[i]; pos=i; } } dis[pos]=0; dfs(pos,pos);//得到其他点到v的距离 for(int i=1;i<=n;i++) d[i]=max(d[i],dis[i])-1;//得到其他点到两端的最大距离 int ans=1,now=1; sort(d+1,d+n+1); for(int i=1;i<=n;i++) { while(now<=n&&i>d[now]) { now++; ans++; } printf("%d ",min(ans,n)); } return 0; }