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

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
}