96 lines
2.1 KiB
Go
96 lines
2.1 KiB
Go
package ds
|
|
|
|
import "testing"
|
|
|
|
func TestBSTInsertInOrder(t *testing.T) {
|
|
tree := NewBST[int]()
|
|
vals := []int{5, 3, 8, 1, 4, 7, 9}
|
|
for _, v := range vals {
|
|
tree.Insert(v)
|
|
}
|
|
got := tree.InOrder()
|
|
want := []int{1, 3, 4, 5, 7, 8, 9}
|
|
if len(got) != len(want) {
|
|
t.Fatalf("InOrder 长度 = %d, want %d", len(got), len(want))
|
|
}
|
|
for i := range want {
|
|
if got[i] != want[i] {
|
|
t.Fatalf("InOrder[%d] = %d, want %d", i, got[i], want[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBSTSearch(t *testing.T) {
|
|
tree := NewBST[int]()
|
|
for _, v := range []int{5, 3, 8, 1} {
|
|
tree.Insert(v)
|
|
}
|
|
if !tree.Search(3) {
|
|
t.Fatal("Search(3) 应为 true")
|
|
}
|
|
if tree.Search(99) {
|
|
t.Fatal("Search(99) 应为 false")
|
|
}
|
|
if tree.Search(0) {
|
|
t.Fatal("Search(0) 应为 false")
|
|
}
|
|
}
|
|
|
|
func TestBSTTraversals(t *testing.T) {
|
|
tree := NewBST[int]()
|
|
// 构造:
|
|
// 4
|
|
// / \
|
|
// 2 6
|
|
// / \ / \
|
|
// 1 3 5 7
|
|
for _, v := range []int{4, 2, 6, 1, 3, 5, 7} {
|
|
tree.Insert(v)
|
|
}
|
|
pre := tree.PreOrder()
|
|
wantPre := []int{4, 2, 1, 3, 6, 5, 7}
|
|
for i := range wantPre {
|
|
if pre[i] != wantPre[i] {
|
|
t.Fatalf("PreOrder[%d] = %d, want %d", i, pre[i], wantPre[i])
|
|
}
|
|
}
|
|
post := tree.PostOrder()
|
|
wantPost := []int{1, 3, 2, 5, 7, 6, 4}
|
|
for i := range wantPost {
|
|
if post[i] != wantPost[i] {
|
|
t.Fatalf("PostOrder[%d] = %d, want %d", i, post[i], wantPost[i])
|
|
}
|
|
}
|
|
lvl := tree.LevelOrder()
|
|
wantLvl := []int{4, 2, 6, 1, 3, 5, 7}
|
|
for i := range wantLvl {
|
|
if lvl[i] != wantLvl[i] {
|
|
t.Fatalf("LevelOrder[%d] = %d, want %d", i, lvl[i], wantLvl[i])
|
|
}
|
|
}
|
|
dfs := tree.DFS()
|
|
// DFS 迭代版是前序,应与 PreOrder 相同
|
|
for i := range wantPre {
|
|
if dfs[i] != wantPre[i] {
|
|
t.Fatalf("DFS[%d] = %d, want %d", i, dfs[i], wantPre[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBSTHeightAndEmpty(t *testing.T) {
|
|
tree := NewBST[int]()
|
|
if tree.Height() != 0 {
|
|
t.Fatal("空树高度应为 0")
|
|
}
|
|
tree.Insert(1)
|
|
if tree.Height() != 1 {
|
|
t.Fatal("单节点高度应为 1")
|
|
}
|
|
tree.Insert(2)
|
|
tree.Insert(3)
|
|
// 退化为链表,高度 3
|
|
if tree.Height() != 3 {
|
|
t.Fatalf("Height = %d, want 3 (退化链表)", tree.Height())
|
|
}
|
|
}
|