二叉搜索树的结构如下:

// Binary Search Tree
type BST struct {
    // Data interface{} 替换为interface可以支持多种数据类型
    Val int
    Left *BST
    Right *BST
}

实现如下操作:

  • 查找(递归/非递归)
  • 删除
  • 插入
  • 最大值
  • 最小值

代码:

package main

// Binary Search Tree
type BST struct {
    // Data interface{}
    Val int
    Left *BST
    Right *BST
}

// BST插入操作递归操作
func (node *BST) Insert(val int) {
    if val < node.Val {
        if node.Left != nil {
            node.Left.Insert(val)
        }else {
            node.Left = &BST{Val:val}
        }
    }else {
        if node.Right != nil {
            node.Right.Insert(val)
        }else {
            node.Right = &BST{Val:val}
        }
    }
}



// BST查找操作递归实现
func (node *BST) SearchRecursion(key int) bool {
    if node == nil {
        return false
    }else if key == node.Val { // 找到结果
        return true
    }else if key > node.Val { // 查找的值大于当前节点在右子树找
        return node.Right.SearchRecursion(key)
    }else if key < node.Val { // 查找的值比当前节点小,在左子树上查找
        return node.Left.SearchRecursion(key)
    }
    return false
}

// BST查找操作迭代实现
func (node *BST) SearchIteration(key int) bool  {
    tree := node
    for {
        if tree == nil{
            return false
        }else if tree.Val == key {
            return true
        }else if tree.Val > key{
            tree = tree.Left
        }else {
            tree = tree.Right
        }
    }
}

// BST最小值
func (node *BST) Min() int {
    tree := node
    for {
        if tree.Left != nil {
            tree = tree.Left
        }else {
            return tree.Val
        }
    }
}


// BST最大值
func (node *BST) Max() int {
    tree := node
    for {
        if tree.Right != nil {
            tree = tree.Right
        }else {
            return tree.Val
        }
    }
}

// BST删除操作
func (node *BST) Remove(key int) *BST {
    if node == nil {
        return nil
    }
    // 向左找
    if key < node.Val {
        return node.Left.Remove(key)
    }

    if key > node.Val {
        return node.Right.Remove(key)
    }

    // 如果该节点没左右子树直接删除
    if node.Left == nil && node.Right == nil {
        node = nil
        return node
    }

    // 有右子树直接用右子树覆盖该节点
    if node.Left == nil {
        node = node.Right
        return node
    }

    // 有左子树直接用左子树覆盖该节点
    if node.Right != nil {
        node = node.Left
        return node
    }
    // 左右子树均存在, 找到右子树的最左节点替换当前节点
    mostLeftMode := node.Right
    for {
        if mostLeftMode != nil && mostLeftMode.Left != nil {
            mostLeftMode = mostLeftMode.Left
        }else {
            break
        }
    }
    node.Val = mostLeftMode.Val

    // 删除右子树的最左节点
    node.Right = node.Right.Remove(node.Val)
    return node
}


func main() {

}