package main
import (
"io"
"os"
)
func appendInt(dst []byte, x int) []byte {
if x == 0 {
return append(dst, '0')
}
if x < 0 {
dst = append(dst, '-')
x = -x
}
var buf [20]byte
i := len(buf)
for x > 0 {
i--
buf[i] = byte('0' + x%10)
x /= 10
}
return append(dst, buf[i:]...)
}
func dist(u, v int, depth []int, up [][]int, lg int) int {
du, dv := depth[u], depth[v]
if du < dv {
u, v = v, u
du, dv = dv, du
}
diff := du - dv
bit := 0
for diff > 0 {
if diff&1 != 0 {
u = up[bit][u]
}
diff >>= 1
bit++
}
if u == v {
return du + dv - 2*depth[u]
}
for k := lg - 1; k >= 0; k-- {
if up[k][u] != up[k][v] {
u = up[k][u]
v = up[k][v]
}
}
l := up[0][u]
return du + dv - 2*depth[l]
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') && data[idx] != '-' {
idx++
}
sign := 1
if data[idx] == '-' {
sign = -1
idx++
}
val := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
val = val*10 + int(data[idx]-'0')
idx++
}
return sign * val
}
t := nextInt()
out := make([]byte, 0, 1<<20)
for ; t > 0; t-- {
n := nextInt()
head := make([]int, n+1)
for i := 1; i <= n; i++ {
head[i] = -1
}
to := make([]int, 2*(n-1))
nxt := make([]int, 2*(n-1))
edgeIdx := 0
for i := 0; i < n-1; i++ {
u := nextInt()
v := nextInt()
to[edgeIdx] = v
nxt[edgeIdx] = head[u]
head[u] = edgeIdx
edgeIdx++
to[edgeIdx] = u
nxt[edgeIdx] = head[v]
head[v] = edgeIdx
edgeIdx++
}
lg := 1
for (1 << lg) <= n {
lg++
}
up := make([][]int, lg)
for i := 0; i < lg; i++ {
up[i] = make([]int, n+1)
}
depth := make([]int, n+1)
queue := make([]int, n)
queue[0] = 1
qh, qt := 0, 1
maxDepth := 0
for qh < qt {
u := queue[qh]
qh++
pu := up[0][u]
for e := head[u]; e != -1; e = nxt[e] {
v := to[e]
if v == pu {
continue
}
up[0][v] = u
depth[v] = depth[u] + 1
if depth[v] > maxDepth {
maxDepth = depth[v]
}
for k := 1; k < lg; k++ {
up[k][v] = up[k-1][up[k-1][v]]
}
queue[qt] = v
qt++
}
}
diamByR := make([]int, maxDepth)
end1, end2, diam := 0, 0, 0
has := false
ptr := n - 1
for d := maxDepth; d >= 1; d-- {
for ptr >= 1 && depth[queue[ptr]] == d {
v := queue[ptr]
if !has {
end1, end2, diam = v, v, 0
has = true
} else {
d1 := dist(v, end1, depth, up, lg)
d2 := dist(v, end2, depth, up, lg)
if d1 >= d2 {
if d1 > diam {
end2 = v
diam = d1
}
} else {
if d2 > diam {
end1 = v
diam = d2
}
}
}
ptr--
}
diamByR[d-1] = diam
}
h := make([]int, maxDepth)
for r := 0; r < maxDepth; r++ {
h[r] = r - (diamByR[r]+1)/2
}
r := 0
for x := 1; x <= n; x++ {
for r < maxDepth && h[r] < x {
r++
}
ans := maxDepth
if r < maxDepth {
ans = r
}
out = appendInt(out, ans)
if x == n {
out = append(out, '\n')
} else {
out = append(out, ' ')
}
}
}
_, _ = os.Stdout.Write(out)
}