← Home
package main

import (
	"bufio"
	"io"
	"os"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	nextInt := func() int {
		for p < len(data) && (data[p] < '0' || data[p] > '9') {
			p++
		}
		v := 0
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			v = v*10 + int(data[p]-'0')
			p++
		}
		return v
	}

	n := nextInt()
	head := make([]int, n+1)
	for i := 1; i <= n; i++ {
		head[i] = -1
	}
	to := make([]int, 2*(n-1))
	next := make([]int, 2*(n-1))
	edgeCnt := 0
	addEdge := func(u, v int) {
		to[edgeCnt] = v
		next[edgeCnt] = head[u]
		head[u] = edgeCnt
		edgeCnt++
	}
	for i := 0; i < n-1; i++ {
		u := nextInt()
		v := nextInt()
		addEdge(u, v)
		addEdge(v, u)
	}

	parent := make([]int, n+1)
	order := make([]int, 0, n)
	stack := make([]int, 0, n)
	stack = append(stack, 1)
	parent[1] = 0
	for len(stack) > 0 {
		u := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		order = append(order, u)
		for e := head[u]; e != -1; e = next[e] {
			v := to[e]
			if v == parent[u] {
				continue
			}
			parent[v] = u
			stack = append(stack, v)
		}
	}

	limit := n / 2
	sz := make([]int, n+1)
	sub := make([]int, n+1)

	for i := len(order) - 1; i >= 0; i-- {
		u := order[i]
		s := 1
		best := 0
		for e := head[u]; e != -1; e = next[e] {
			v := to[e]
			if v == parent[u] {
				continue
			}
			s += sz[v]
			if sub[v] > best {
				best = sub[v]
			}
		}
		sz[u] = s
		if s <= limit && s > best {
			best = s
		}
		sub[u] = best
	}

	up := make([]int, n+1)
	for _, u := range order {
		top1, top2 := 0, 0
		for e := head[u]; e != -1; e = next[e] {
			v := to[e]
			if v == parent[u] {
				continue
			}
			val := sub[v]
			if val >= top1 {
				top2 = top1
				top1 = val
			} else if val > top2 {
				top2 = val
			}
		}
		for e := head[u]; e != -1; e = next[e] {
			v := to[e]
			if v == parent[u] {
				continue
			}
			best := up[u]
			if sub[v] == top1 {
				if top2 > best {
					best = top2
				}
			} else {
				if top1 > best {
					best = top1
				}
			}
			comp := n - sz[v]
			if comp <= limit && comp > best {
				best = comp
			}
			up[v] = best
		}
	}

	out := make([]byte, 0, 2*n)
	for u := 1; u <= n; u++ {
		mx := n - sz[u]
		best := up[u]
		for e := head[u]; e != -1; e = next[e] {
			v := to[e]
			if v == parent[u] {
				continue
			}
			if sz[v] > mx {
				mx = sz[v]
				best = sub[v]
			}
		}
		if u > 1 {
			out = append(out, ' ')
		}
		if mx <= limit || mx-best <= limit {
			out = append(out, '1')
		} else {
			out = append(out, '0')
		}
	}
	out = append(out, '\n')

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out)
	w.Flush()
}