package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var t int
fmt.Fscan(in, &t)
for i := 0; i < t; i++ {
solve(in, out)
}
}
func solve(in *bufio.Reader, out *bufio.Writer) {
var n int
fmt.Fscan(in, &n)
adj := make([][]int, n+1)
for i := 0; i < n-1; i++ {
var u, v int
fmt.Fscan(in, &u, &v)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
up := make([][15]int, n+1)
depth := make([]int, n+1)
var dfs func(int, int, int)
dfs = func(u, p, d int) {
up[u][0] = p
depth[u] = d
for i := 1; i < 15; i++ {
up[u][i] = up[up[u][i-1]][i-1]
}
for _, v := range adj[u] {
if v != p {
dfs(v, u, d+1)
}
}
}
dfs(1, 1, 0)
lca := func(u, v int) int {
if depth[u] < depth[v] {
u, v = v, u
}
diff := depth[u] - depth[v]
for i := 0; i < 15; i++ {
if (diff & (1 << i)) != 0 {
u = up[u][i]
}
}
if u == v {
return u
}
for i := 14; i >= 0; i-- {
if up[u][i] != up[v][i] {
u = up[u][i]
v = up[v][i]
}
}
return up[u][0]
}
dist := func(u, v int) int {
if u == -1 || v == -1 {
return 0
}
return depth[u] + depth[v] - 2*depth[lca(u, v)]
}
maxDepth := 0
nodesByDepth := make([][]int, n+1)
for i := 1; i <= n; i++ {
if depth[i] > maxDepth {
maxDepth = depth[i]
}
nodesByDepth[depth[i]] = append(nodesByDepth[depth[i]], i)
}
ans := make([]int, n+1)
for i := 1; i <= n; i++ {
ans[i] = maxDepth
}
u, v := -1, -1
diam := 0
for k := maxDepth - 1; k >= 0; k-- {
for _, z := range nodesByDepth[k+1] {
if u == -1 {
u = z
v = z
diam = 0
} else {
d1 := dist(z, u)
d2 := dist(z, v)
if d1 > diam && d1 >= d2 {
diam = d1
v = z
} else if d2 > diam {
diam = d2
u = z
}
}
}
r := (diam + 1) / 2
xMax := k - r
if xMax >= 1 {
if xMax > n {
xMax = n
}
if k < ans[xMax] {
ans[xMax] = k
}
}
}
for i := n - 1; i >= 1; i-- {
if ans[i+1] < ans[i] {
ans[i] = ans[i+1]
}
}
for i := 1; i <= n; i++ {
if i > 1 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, ans[i])
}
fmt.Fprintln(out)
}