AVL树简介
AVL 树是高度相对平衡(abs(height(node.lchild - height(node.rchild) < 2)
)的二叉搜索树。它和二叉搜索树主要的区别在AVL是高度平衡的,不会出现二叉搜索树极端情况:线性链表 搜索复杂度为N
。
实现上,AVL树在插入节点
和删除节点
时要不断调整树,使其处在一个平衡状态。和二叉搜索树相比主要增加树旋转
、调整
。
实现源码
package main
import (
"errors"
"fmt"
)
var (
errNotExist = errors.New("index is not existed")
errTreeNil = errors.New("tree is null")
errTreeIndexExist = errors.New("tree index is existed")
)
type Node struct {
lchild *Node
rchild *Node
height int //树的深度
index int
data int
}
func max(data1 int, data2 int) int {
if data1 > data2 {
return data1
}
return data2
}
func getHeight(node *Node) int {
if node == nil {
return 0
}
return node.height
}
// 左旋转
//
// node BF = 2
// \
// prchild -----> prchild BF = 1
// \ / \
// pprchild node pprchild
func llRotation(node *Node) *Node {
prchild := node.rchild
node.rchild = prchild.lchild
prchild.lchild = node
//更新节点 node 的高度
node.height = max(getHeight(node.lchild), getHeight(node.rchild)) + 1
//更新新父节点高度
prchild.height = max(getHeight(prchild.lchild), getHeight(prchild.rchild)) + 1
return prchild
}
// 右旋转
// node BF = -2
// /
// plchild -----> plchild BF = 1
// / / \
// pplchild lchild node
func rrRotation(node *Node) *Node {
plchild := node.lchild
node.lchild = plchild.rchild
plchild.rchild = node
node.height = max(getHeight(node.lchild), getHeight(node.rchild)) + 1
plchild.height = max(getHeight(node), getHeight(plchild.lchild)) + 1
return plchild
}
// 先左转再右转
// node node
// / 左 / 右