Files
leetcode/data-structure/ds-btree_test.go
T
2026-07-20 19:57:25 +08:00

108 lines
2.6 KiB
Go

package ds
import "testing"
// 辅助:int 指针构造器,简化测试用例。
func iptr(i int) *int { return &i }
func TestBuildTreeRoundTrip(t *testing.T) {
// 1
// / \
// 2 3
// / \
// 4 5
vals := []*int{iptr(1), iptr(2), iptr(3), nil, nil, iptr(4), iptr(5)}
root := BuildTree[int](vals)
if root == nil {
t.Fatal("BuildTree 不应返回 nil")
}
// 层序应为 [1,2,3,nil,nil,4,5]
out := TreeToLevelOrder[int](root)
want := []*int{iptr(1), iptr(2), iptr(3), nil, nil, iptr(4), iptr(5)}
if len(out) != len(want) {
t.Fatalf("TreeToLevelOrder 长度 = %d, want %d", len(out), len(want))
}
for i := range want {
if (out[i] == nil) != (want[i] == nil) {
t.Fatalf("位置 %d: out nil=%v, want nil=%v", i, out[i] == nil, want[i] == nil)
}
if out[i] != nil && *out[i] != *want[i] {
t.Fatalf("位置 %d: out = %d, want %d", i, *out[i], *want[i])
}
}
}
func TestBuildTreeTraversals(t *testing.T) {
// 1
// / \
// 2 3
// / \
// 4 5
vals := []*int{iptr(1), iptr(2), iptr(3), iptr(4), iptr(5)}
root := BuildTree[int](vals)
pre := PreOrderAny[int](root)
wantPre := []int{1, 2, 4, 5, 3}
for i := range wantPre {
if pre[i] != wantPre[i] {
t.Fatalf("PreOrderAny[%d] = %d, want %d", i, pre[i], wantPre[i])
}
}
in := InOrderAny[int](root)
wantIn := []int{4, 2, 5, 1, 3}
for i := range wantIn {
if in[i] != wantIn[i] {
t.Fatalf("InOrderAny[%d] = %d, want %d", i, in[i], wantIn[i])
}
}
post := PostOrderAny[int](root)
wantPost := []int{4, 5, 2, 3, 1}
for i := range wantPost {
if post[i] != wantPost[i] {
t.Fatalf("PostOrderAny[%d] = %d, want %d", i, post[i], wantPost[i])
}
}
lvl := LevelOrderAny[int](root)
wantLvl := []int{1, 2, 3, 4, 5}
for i := range wantLvl {
if lvl[i] != wantLvl[i] {
t.Fatalf("LevelOrderAny[%d] = %d, want %d", i, lvl[i], wantLvl[i])
}
}
}
func TestBuildTreeEdgeCases(t *testing.T) {
// 空数组
if r := BuildTree[int](nil); r != nil {
t.Fatal("空数组应返回 nil")
}
// 数组首元素为 nil
if r := BuildTree[int]([]*int{nil, iptr(1)}); r != nil {
t.Fatal("首元素 nil 应返回 nil")
}
// 单节点
root := BuildTree[int]([]*int{iptr(42)})
if root.Val != 42 || root.Left != nil || root.Right != nil {
t.Fatalf("单节点树结构错误: %+v", root)
}
}
func TestMaxDepth(t *testing.T) {
// 1
// / \
// 2 3
// /
// 4
vals := []*int{iptr(1), iptr(2), iptr(3), iptr(4)}
root := BuildTree[int](vals)
if d := MaxDepth[int](root); d != 3 {
t.Fatalf("MaxDepth = %d, want 3", d)
}
if d := MaxDepth[int](nil); d != 0 {
t.Fatalf("空树 MaxDepth = %d, want 0", d)
}
}