170 lines
3.3 KiB
Go
170 lines
3.3 KiB
Go
package ds
|
|
|
|
// ds-tree.go
|
|
// 泛型二叉搜索树 (BST)。T 约束为 Ordered,Insert/Search 均基于比较。
|
|
// 中序遍历天然有序;提供递归与迭代两种遍历入口。
|
|
// 不做自平衡,退化时退化为链表;leetcode 题目里常需要这种朴素 BST 作为基础。
|
|
|
|
// TreeNode 二叉树节点。
|
|
type TreeNode[T any] struct {
|
|
Val T
|
|
Left *TreeNode[T]
|
|
Right *TreeNode[T]
|
|
}
|
|
|
|
// BST 二叉搜索树。
|
|
type BST[T Ordered] struct {
|
|
Root *TreeNode[T]
|
|
}
|
|
|
|
// Ordered 约束:支持 < <= > >= 比较。
|
|
type Ordered interface {
|
|
~int | ~int8 | ~int16 | ~int32 | ~int64 |
|
|
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
|
|
~float32 | ~float64 | ~string
|
|
}
|
|
|
|
// NewBST 创建空 BST。
|
|
func NewBST[T Ordered]() *BST[T] { return &BST[T]{} }
|
|
|
|
// Insert 按 BST 性质插入,重复值放右子树。
|
|
func (t *BST[T]) Insert(v T) {
|
|
t.Root = insertNode(t.Root, v)
|
|
}
|
|
|
|
func insertNode[T Ordered](node *TreeNode[T], v T) *TreeNode[T] {
|
|
if node == nil {
|
|
return &TreeNode[T]{Val: v}
|
|
}
|
|
if v < node.Val {
|
|
node.Left = insertNode(node.Left, v)
|
|
} else {
|
|
node.Right = insertNode(node.Right, v)
|
|
}
|
|
return node
|
|
}
|
|
|
|
// Search 查找值是否存在。
|
|
func (t *BST[T]) Search(v T) bool {
|
|
cur := t.Root
|
|
for cur != nil {
|
|
if v == cur.Val {
|
|
return true
|
|
}
|
|
if v < cur.Val {
|
|
cur = cur.Left
|
|
} else {
|
|
cur = cur.Right
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// InOrder 中序遍历(左→根→右),BST 上结果升序。递归版。
|
|
func (t *BST[T]) InOrder() []T {
|
|
var out []T
|
|
var walk func(*TreeNode[T])
|
|
walk = func(n *TreeNode[T]) {
|
|
if n == nil {
|
|
return
|
|
}
|
|
walk(n.Left)
|
|
out = append(out, n.Val)
|
|
walk(n.Right)
|
|
}
|
|
walk(t.Root)
|
|
return out
|
|
}
|
|
|
|
// PreOrder 前序遍历(根→左→右)。递归版。
|
|
func (t *BST[T]) PreOrder() []T {
|
|
var out []T
|
|
var walk func(*TreeNode[T])
|
|
walk = func(n *TreeNode[T]) {
|
|
if n == nil {
|
|
return
|
|
}
|
|
out = append(out, n.Val)
|
|
walk(n.Left)
|
|
walk(n.Right)
|
|
}
|
|
walk(t.Root)
|
|
return out
|
|
}
|
|
|
|
// PostOrder 后序遍历(左→右→根)。递归版。
|
|
func (t *BST[T]) PostOrder() []T {
|
|
var out []T
|
|
var walk func(*TreeNode[T])
|
|
walk = func(n *TreeNode[T]) {
|
|
if n == nil {
|
|
return
|
|
}
|
|
walk(n.Left)
|
|
walk(n.Right)
|
|
out = append(out, n.Val)
|
|
}
|
|
walk(t.Root)
|
|
return out
|
|
}
|
|
|
|
// LevelOrder 层序遍历 (BFS),借助上面定义的 Queue。
|
|
func (t *BST[T]) LevelOrder() []T {
|
|
if t.Root == nil {
|
|
return nil
|
|
}
|
|
var out []T
|
|
q := &Queue[*TreeNode[T]]{}
|
|
q.Enqueue(t.Root)
|
|
for !q.Empty() {
|
|
node, _ := q.Dequeue()
|
|
out = append(out, node.Val)
|
|
if node.Left != nil {
|
|
q.Enqueue(node.Left)
|
|
}
|
|
if node.Right != nil {
|
|
q.Enqueue(node.Right)
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
// Height 树高(空树为 0,单节点为 1)。
|
|
func (t *BST[T]) Height() int {
|
|
var h func(*TreeNode[T]) int
|
|
h = func(n *TreeNode[T]) int {
|
|
if n == nil {
|
|
return 0
|
|
}
|
|
l := h(n.Left)
|
|
r := h(n.Right)
|
|
if l > r {
|
|
return l + 1
|
|
}
|
|
return r + 1
|
|
}
|
|
return h(t.Root)
|
|
}
|
|
|
|
// DFS 迭代版深度优先遍历(前序),用栈模拟。作为迭代遍历的示例。
|
|
func (t *BST[T]) DFS() []T {
|
|
if t.Root == nil {
|
|
return nil
|
|
}
|
|
var out []T
|
|
st := &Stack[*TreeNode[T]]{}
|
|
st.Push(t.Root)
|
|
for !st.Empty() {
|
|
node, _ := st.Pop()
|
|
out = append(out, node.Val)
|
|
// 先压右再压左,弹出顺序才是 根→左→右
|
|
if node.Right != nil {
|
|
st.Push(node.Right)
|
|
}
|
|
if node.Left != nil {
|
|
st.Push(node.Left)
|
|
}
|
|
}
|
|
return out
|
|
}
|