// first second push_back unordered return continue break vector visited check flag bool while iterator begin end lower_bound upper_bound temp true false ll_MAX ll_MIN insert erase clear pop push compare ll64_MAX ll64_MIN  reverse replace stringstream string::npos length substr front priority_queue

#ifndef ONLINE_JUDGE
#include "debug.h"
#else
#include <bits/stdc++.h>
using namespace std;
#define debug(...) 42
#endif

#define ll long long
#define rep(i,x,n,inc) for(i=x ; i<n ; i+=inc)

const ll sz = 300119;
std::vector<ll> adj[sz];

ll dep[sz], di;
vector<ll>d1(sz, 0), el, vis(sz, 0), d2(sz, 0), d3(sz, 0);

ll dfs(ll u , ll h) {
	vis[u] = 1;
	d1[u] = h;
	ll f = 0, s = 0;
	for (auto v : adj[u]) {
		if (!vis[v]) {
			ll sub = dfs(v, h + 1);

			f = max(sub, f);
			if (f > s)	swap(f, s);
		}
	}
	d2[u] = f, d3[u] = s;
	di = max({di, d2[u] + d3[u]});

	return max(1LL + d2[u], 1LL + d3[u]);
}

void bfs(ll u , ll h = 0) {
	vis[u] = 1;
	debug(u, h);
	if ((adj[u].size() == 1) and h)	el.push_back(u);

	for (auto v : adj[u]) {
		if (!vis[v]) {
			ll z = max(d2[v], d3[v]) + 1;

			if (z == di) {
				el.push_back(u);
				bfs(v, 1);
			} else if (d2[u] + d3[u] == di and (z == d2[u] or z == d3[u])) {
				// } else if ((z == d2[u] or z == d3[u])) {
				// debug(v);
				bfs(v, 1);
			}
			else {
				bfs(v, h);
			}
		}
	}

	if (max(d2[u], d3[u]) == di) {
		// debug(u);
		el.push_back(u);
	}
}

int32_t main() {
	ios::sync_with_stdio(0); 		cin.tie(0); cout.tie(0);

	ll t, i, x, j, y, 	z, k, n;
	cin >> n;

	rep(i, 0, n - 1, 1) {
		cin >> x >> y;
		adj[x].push_back(y);
		adj[y].push_back(x);
	}

	dfs(1, 0);
	vector<ll>ans(n + 1);

	rep(i, 0, 1 + n, 1)	{
		ans[i] = di;
		vis[i] = 0;
	}
	bfs(1, 0);

	for (auto zx : el)	ans[zx] = di + 1;

	rep(i, 1, 1 + n, 1)	cout << ans[i] << " ";
	debug(di, ans, el);
}

