#include <bits/stdc++.h>   using namespace std;   namespace IO {   const int __S = (1 << 20) + 5;   char __buf[__S], *__H, *__T;   inline char getc() {     if (__H == __T) __T = (__H = __buf) + fread(__buf, 1, __S, stdin);     if (__H == __T) return -1;     return *__H++;   }   template <class __I>   inline void read(__I &__x) {     __x = 0;     int __fg = 1;     char __c = getc();     while (!isdigit(__c) && __c !=  - ) __c = getc();     if (__c ==  - ) __fg = -1, __c = getc();     while (isdigit(__c)) __x = __x * 10 + __c -  0 , __c = getc();     __x *= __fg;   }   inline void readd(double &__x) {     __x = 0;     double __fg = 1.0;     char __c = getc();     while (!isdigit(__c) && __c !=  - ) __c = getc();     if (__c ==  - ) __fg = -1.0, __c = getc();     while (isdigit(__c)) __x = __x * 10.0 + __c -  0 , __c = getc();     if (__c !=  . ) {       __x = __x * __fg;       return;     } else       while (!isdigit(__c)) __c = getc();     double __t = 1e-1;     while (isdigit(__c))       __x = __x + 1.0 * (__c -  0 ) * __t, __t = __t * 0.1, __c = getc();     __x = __x * __fg;   }   inline void reads(char *__s, int __x) {     char __c = getc();     int __tot = __x - 1;     while (__c <  !  || __c >  ~ ) __c = getc();     while (__c >=  !  && __c <=  ~ ) __s[++__tot] = __c, __c = getc();     __s[++__tot] =   0 ;   }   char __obuf[__S], *__oS = __obuf, *__oT = __oS + __S - 1, __c, __qu[55];   int __qr;   inline void flush() {     fwrite(__obuf, 1, __oS - __obuf, stdout);     __oS = __obuf;   }   inline void putc(char __x) {     *__oS++ = __x;     if (__oS == __oT) flush();   }   template <class __I>   inline void print(__I __x) {     if (!__x) putc( 0 );     if (__x < 0) putc( - ), __x = -__x;     while (__x) __qu[++__qr] = __x % 10 +  0 , __x /= 10;     while (__qr) putc(__qu[__qr--]);   }   inline void prints(const char *__s, const int __x) {     int __len = strlen(__s + __x);     for (int __i = __x; __i < __len + __x; __i++) putc(__s[__i]);   }   inline void printd(double __x, int __d) {     long long __t = (long long)floor(__x);     print(__t);     putc( . );     __x -= (double)__t;     while (__d--) {       double __y = __x * 10.0;       __x *= 10.0;       int __c = (int)floor(__y);       putc(__c +  0 );       __x -= floor(__y);     }   }   inline void el() { putc(  n ); }   inline void sp() { putc(   ); }   }  // namespace IO   using namespace IO;   int cnt, sz[400005], usz[400005], n, x, y, g[400005], to[800005], he[400005],       ne[800005], fm[400005], um[400005], sm[400005], ans[400005];   void dfs1(int x, int fa) {     sz[x] = 1;     for (int i = he[x], y; ~i; i = ne[i])       if ((y = to[i]) != fa) {         dfs1(y, x), sz[x] += sz[y];         if (sz[y] > n / 2)           g[x] = y, sm[x] = max(sm[x], fm[y]),           sm[x] > fm[x] ? swap(sm[x], fm[x]) : void(0);         else           sm[x] = max(sm[x], sz[y]), sm[x] > fm[x] ? swap(sm[x], fm[x]) : void(0);       }     usz[x] = n - sz[x];     if (usz[x] > n / 2) g[x] = -1;   }   void dfs2(int x, int fa) {     if (usz[x] <= n / 2)       um[x] = usz[x];     else {       if (fm[fa] == sz[x])         um[x] = sm[fa];       else         um[x] = fm[fa];       um[x] = max(um[x], um[fa]);     }     for (int i = he[x], y; ~i; i = ne[i])       if ((y = to[i]) != fa) dfs2(y, x);   }   void add(int x, int y) {     to[cnt] = y;     ne[cnt] = he[x];     he[x] = cnt++;   }   int main() {     memset(he, -1, sizeof(he));     read(n);     for (int i = 1; i < n; i++) read(x), read(y), add(x, y), add(y, x);     dfs1(1, 0);     dfs2(1, 0);     for (int i = 1; i <= n; i++) {       if (!g[i])         ans[i] = 1;       else if (g[i] == -1 && usz[i] - um[i] <= n / 2)         ans[i] = 1;       else if (g[i] != -1 && sz[g[i]] - fm[g[i]] <= n / 2)         ans[i] = 1;     }     for (int i = 1; i <= n; i++) print(ans[i]), sp();     flush();   }