package TRGAME
import kotlin.
system.
exitProcess
fun main(args: Array<String>) {
if(args.isNotEmpty()) {
System.setIn(java.io.FileInputStream(args[0]))
}
if(args.size >= 2) {
System.setOut(java.io.PrintStream(args[1]))
}
val numTests = readLine()!!.toInt()
require(numTests in 1..100000)
var sumN = 0
repeat(numTests) {
val N = readLine()!!.toInt()
require(N in 1..100000)
sumN += N
require(sumN <= 100000)
val gph = List(N) { mutableListOf<Int>() }
run {
val grp = IntArray(N) { it }
fun get_group(u: Int): Int {
if(grp[u] != u) {
grp[u] = get_group(grp[u])
}
return grp[u]
}
repeat(N-1) {
val (u, v) = readLine()!!.split(" ").map{ it.toInt() - 1 }
require(u in 0 until N)
require(v in 0 until N)
gph[u].add(v)
gph[v].add(u)
val a = get_group(u)
val b = get_group(v)
require(a != b)
grp[a] = b
}
}
val subtreeSize = IntArray(N)
run {
val visited = BooleanArray(N)
val queue: java.util.Queue<Int> = java.util.ArrayDeque<Int>()
val order = mutableListOf<Int>()
queue.add(0)
visited[0] = true
while(!queue.isEmpty()) {
val u = queue.poll()
order.add(u)
for(v in gph[u]) if(!visited[v]) {
queue.add(v)
visited[v] = true
}
}
order.reverse()
for(u in order) {
subtreeSize[u] = gph[u].map{ subtreeSize[it] }.sum() + 1
}
}
if(N % 2 == 0) {
println(List(N) { x -> if(maxOf(gph[x].map{ subtreeSize[it] }.filter{ it < subtreeSize[x] }.max()?:0, N - subtreeSize[x]) * 2 <= N) 1 else 0 }.joinToString(""))
}else {
println("0".repeat(N))
}
}
require(readLine() == null)
}