#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
const ll llinf = (1ll << 61) - 1;
const double eps = 1e-6, ldeps = 1e-9;
struct Dbg {
  static constexpr auto &os = cout;
  template <class C>
  static auto dud(C *x) -> decltype(os << *x, 0);
  template <class C>
  static char dud(...);
  template <class C>
  typename enable_if<sizeof dud<C>(0) != 1, Dbg &>::type operator<<(
      const C &x) {
    os << x;
    return *this;
  }
  template <class C>
  Dbg &dump(C b, C e) {
    *this << "\n[";
    int cur = 0;
    for (C i = b; i != e and cur < 26; i++, cur++)
      *this << ", " + 2 * (i == b) << *i;
    return *this << ']';
  }
  template <class C>
  typename enable_if<sizeof dud<C>(0) == 1, Dbg &>::type operator<<(
      const C &x) {
    return dump(begin(x), end(x));
  }
  template <class C, size_t X>
  typename enable_if<sizeof(C) != 1, Dbg &>::type operator<<(C (&x)[X]) {
    return dump(begin(x), end(x));
  }
  template <class B, class C>
  Dbg &operator<<(const pair<B, C> &x) {
    return *this << '{' << x.first << ", " << x.second << '}';
  }
  template <class C, size_t Y>
  struct TP {
    void operator()(Dbg &os, const C &t) {
      TP<C, Y - 1>()(os, t);
      os << ", " << get<Y - 1>(t);
    }
  };
  template <class C>
  struct TP<C, 1> {
    void operator()(Dbg &os, const C &t) { os << get<0>(t); }
  };
  template <class... C>
  Dbg &operator<<(const tuple<C...> &t) {
    os << '{', TP<decltype(t), sizeof...(C)>()(*this, t);
    return *this << '}';
  }
  Dbg &operator<<(ostream &(*x)(std::ostream &)) {
    os << x;
    return *this;
  }
} dbg;
void err(istringstream *iss) { delete iss; }
template <class C, class... Args>
void err(istringstream *iss, const C &val, const Args &...args) {
  string name;
  *iss >> name;
  if (name.back() == ',') name.pop_back();
  dbg << name << " = " << val << "; ", err(iss, args...);
}
int T, Q, cn;
const int inf = 1000000007, mxn = 1000005;
list<int> g[mxn];
int n, m, col[mxn];
int sz[mxn], dfs_time, disc[mxn], fin[mxn], ver[mxn];
void getsz(int u, int p) {
  disc[u] = dfs_time++, ver[disc[u]] = u;
  col[u] = col[p] + 1;
  sz[u] = 1;
  for (auto &v : g[u])
    if (v != p) {
      getsz(v, u);
      sz[u] += sz[v];
    }
  fin[u] = dfs_time;
}
struct cmp {
  bool operator()(const pair<int, int> &ls, const pair<int, int> &rs) const {
    return tie(rs.first, ls.second) < tie(ls.first, rs.second);
  }
};
int ans[mxn];
set<pair<int, int>, cmp> s;
int cnt[mxn];
void dfs(int u, int p, bool keep = 0) {
  int mx = -1, bigChild = -1;
  for (auto &v : g[u])
    if (v != p && sz[v] > mx) mx = sz[v], bigChild = v;
  for (auto &v : g[u])
    if (v != p && v != bigChild) dfs(v, u, 0);
  if (bigChild != -1) dfs(bigChild, u, 1);
  for (auto &v : g[u])
    if (v != p && v != bigChild)
      for (int i = disc[v]; i < fin[v]; i++)
        s.erase(s.find({cnt[col[ver[i]]], col[ver[i]]})), cnt[col[ver[i]]]++,
            s.insert({cnt[col[ver[i]]], col[ver[i]]});
  s.erase(s.find({cnt[col[u]], col[u]})), cnt[col[u]]++,
      s.insert({cnt[col[u]], col[u]});
  ans[u] = s.begin()->second - col[u];
  if (!keep)
    for (int i = disc[u]; i < fin[u]; i++)
      s.erase(s.find({cnt[col[ver[i]]], col[ver[i]]})), cnt[col[ver[i]]]--,
          s.insert({cnt[col[ver[i]]], col[ver[i]]});
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(NULL);
  cout.precision(11);
  cin >> n;
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v), g[v].push_back(u);
  }
  for (int i = 1; i <= n; i++) {
    s.insert({0, i});
  }
  getsz(1, 0), dfs(1, 0);
  for (int i = 1; i <= n; i++) {
    cout << ans[i] << '\n';
  }
}
