#include <bits/stdc++.h>
using namespace std;
const int maxn = 400010;
inline int max(int a, int b) { return a > b ? a : b; }
int head[maxn], cnt, sz[maxn], n, mx_sz, top[maxn], ans[maxn];
vector<int> vt;
struct ed {
  int to, next;
} e[maxn * 2];
void ad(int x, int y) {
  e[cnt] = (ed){y, head[x]};
  head[x] = cnt++;
  e[cnt] = (ed){x, head[y]};
  head[y] = cnt++;
}
void get_vt(int u, int last) {
  sz[u] = 1;
  int mx = 0;
  for (int k = head[u]; ~k; k = e[k].next) {
    int v = e[k].to;
    if (v != last) {
      get_vt(v, u);
      sz[u] += sz[v];
      mx = max(mx, sz[v]);
    }
  }
  mx = max(mx, n - sz[u]);
  if (mx <= mx_sz) vt.push_back(u);
}
void dfs(int u, int last, int tp) {
  sz[u] = 1, top[u] = tp;
  for (int k = head[u]; ~k; k = e[k].next) {
    int v = e[k].to;
    if (v != last) {
      dfs(v, u, tp);
      sz[u] += sz[v];
    }
  }
}
void work(int u) {
  ans[u] = 1;
  memset(sz, 0, sizeof(sz));
  int mx = 0, _mx = 0;
  for (int k = head[u]; ~k; k = e[k].next) {
    int v = e[k].to;
    dfs(v, u, v);
    if (sz[v] >= sz[mx])
      _mx = mx, mx = v;
    else if (sz[v] > sz[_mx])
      _mx = v;
  }
  for (int i = 1; i <= n; i++) {
    if (top[i] == mx)
      ans[i] |= (n - sz[i] - sz[_mx] <= mx_sz);
    else
      ans[i] |= (n - sz[i] - sz[mx] <= mx_sz);
  }
}
int main() {
  while (~scanf("%d", &n)) {
    cnt = 0;
    mx_sz = n / 2;
    vt.clear();
    memset(sz, 0, sizeof(sz));
    memset(ans, 0, sizeof(ans));
    memset(head, -1, sizeof(head));
    int u, v;
    for (int i = 1; i < n; i++) {
      scanf("%d%d", &u, &v);
      ad(u, v);
    }
    get_vt(1, 0);
    for (int i = 0; i < vt.size(); i++) work(vt[i]);
    for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
  }
  return 0;
}
