二叉搜索树的结构如下:
// 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() {
}

京公网安备 11010502036488号