#include <bits/stdc++.h>
using namespace std;
const long long linf = 1e18 + 9;
const int inf = 1e9 + 9;
const long long mod = 1e9 + 7;
const int N = 4e5 + 9;
int n, u, v, ans[N], sub[N], mx[N], centroid;
vector<int> gr[N], c[N];
int dfs(int v, int f) {
  sub[v] = 1;
  for (int i = 0; i < gr[v].size(); i++) {
    if (gr[v][i] == f) continue;
    int t = dfs(gr[v][i], v);
    sub[v] += t;
    mx[v] = max(mx[v], t);
    c[v].push_back(t);
  }
  if ((n - sub[v]) <= n / 2 and mx[v] <= n / 2) {
    ans[v] = 1;
    centroid = v;
  }
  return sub[v];
}
void dfs2(int v, int f, int cur, int root) {
  if (v != centroid and ans[v] == 0) {
    int t = c[centroid].size() - 1;
    if (sub[root] == c[centroid][t]) t--;
    if (t >= 0 and n - sub[v] - c[centroid][t] <= n / 2)
      ans[v] = 1;
    else {
      if (cur - sub[v] <= n / 2)
        ans[v] = 1;
      else
        ans[v] = 0;
    }
  }
  if (n - sub[v] <= n / 2) cur = sub[v];
  for (int i = 0; i < gr[v].size(); i++) {
    if (gr[v][i] == f) continue;
    if (v == centroid) root = gr[v][i];
    dfs2(gr[v][i], v, cur, root);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    scanf("%d %d", &u, &v);
    gr[u].push_back(v);
    gr[v].push_back(u);
  }
  dfs(1, 0);
  memset(mx, 0, sizeof mx);
  for (int i = 1; i <= n; i++) c[i].clear();
  dfs(centroid, 0);
  for (int i = 1; i <= n; i++) sort(c[i].begin(), c[i].end());
  dfs2(centroid, 0, 0, 0);
  for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
  return 0;
}
