算法Go语言描述📌treestruct📌1-bst.go
package treestruct

type BstNode struct {
	value int      // 值
	left  *BstNode // 左子树
	right *BstNode // 右子树
}
type BinarySearchTree struct {
	root *BstNode // 根结点
}

func (tree *BinarySearchTree) Search(v int) *BstNode {
	for p := tree.root; p != nil; {
		if v == p.value {
			return p
		}
		if v < p.value {
			p = p.left
		} else {
			p = p.right
		}
	}
	return nil
}

func (tree *BinarySearchTree) Min() *BstNode {
	if tree.root == nil {
		return nil
	}
	res := tree.root
	for res.left != nil {
		res = res.left
	}
	return res
}

func (tree *BinarySearchTree) Max() *BstNode {
	if tree.root == nil {
		return nil
	}
	res := tree.root
	for res.right != nil {
		res = res.right
	}
	return res
}

func (tree *BinarySearchTree) Insert(v int) bool {
	if tree.root == nil {
		tree.root = &BstNode{value: v}
		return true
	}
	p := tree.root
	for {
		if v == p.value {
			return false
		}
		if v < p.value {
			if p.left == nil {
				p.left = &BstNode{value: v}
				break
			}
			p = p.left
		} else {
			if p.right == nil {
				p.right = &BstNode{value: v}
				break
			}
			p = p.right
		}
	}
	return true
}

/*
删除值所在结点的不同情况:
未找到不作任何处理,无子树直接删除。
有一个子树,该子树直接替换被删的结点。
有两个子树,右子树的最小值结点(或左子树最大结点)替换被删的结点。
    p?                 p?
    |                 ||
   3(o)              4(n)
  /  \              // \\
 2    8            2    8
     / \               / \
   6(t) 9   ==>      6(t) 9
  / \               // \
4(n) 7             5    7
\
 5
3(o)右子树的最小结点是4(n),将4(n)移动到3(o)的位置,n.left拼上原o.left。
当t!=o即n!=o.right时,还需将t.left拼上原n.right(含nil),再将n.right拼上原o.right。
最后当p!=nil时将p和n连接上,p==nil时n直接设为根结点。
*/

func (tree *BinarySearchTree) Delete(v int) bool {
	o := tree.root //待删除old结点
	var p *BstNode //o.parent
	for o != nil {
		if v == o.value { //找到待删除结点
			break
		}
		p = o
		if v < o.value {
			o = o.left
		} else {
			o = o.right
		}
	}
	if o == nil { //未找到
		return false
	}
	var n *BstNode //替换old的new结点
	if o.left == nil {
		n = o.right //左子树为空,右子树替换(含nil)
	} else if o.right == nil {
		n = o.left //右子树为空,左子树替换
	} else { //左右子树均不为空,右子树的最小结点(或左子树的最大结点)替换待删除结点
		t := o      //n.parent
		n = o.right //右子树的最小结点
		for n.left != nil {
			t = n
			n = n.left
		}
		n.left = o.left //new结点拼上old结点的左子树
		if t != o {     //即n!=o.right
			t.left = n.right
			n.right = o.right
		}
	}
	if p == nil {
		tree.root = n
	} else {
		if v < p.value {
			p.left = n //是其左子树
		} else {
			p.right = n //是其右子树
		}
	}
	return true
}

// 中序遍历返回有序数组
func (tree *BinarySearchTree) InOrderTraversal() []int {
	var res []int
	tree.root.inOrderTraversal(&res)
	return res
}
func (node *BstNode) inOrderTraversal(res *[]int) {
	if node != nil {
		node.left.inOrderTraversal(res)
		*res = append(*res, node.value)
		node.right.inOrderTraversal(res)
	}
}