// 代码转载自https://blog.csdn.net/qq_36183935/article/details/80315808, 向原作者致谢
package main
import "fmt"
type AVL struct {
value int //值
height int //深度
left *AVL //左子树
right *AVL //右子树
}
//查找元素
func (t *AVL) Search(value int) bool {
if t == nil {
return false
}
compare := value - t.value
if compare < 0 {
return t.left.Search(value)
} else if compare > 0 {
return t.right.Search(value)
} else {
return true
}
}
func (t *AVL) leftRotate() *AVL { //左旋转
headNode := t.right
t.right = headNode.left
headNode.left = t
//更新结点高度
t.height = max(t.left.getHeight(), t.right.getHeight()) + 1
headNode.height = max(headNode.left.getHeight(), headNode.right.getHeight()) + 1
return headNode
}
func (t *AVL) rightRotate() *AVL { //右旋转
headNode := t.left
t.left = headNode.right
headNode.right = t
//更新结点高度
t.height = max(t.left.getHeight(), t.right.getHeight()) + 1
headNode.height = max(headNode.left.getHeight(), headNode.right.getHeight()) + 1
return headNode
}
func (t *AVL) rightThenLeftRotate() *AVL { //右旋转,之后左旋转
//以失衡点右结点先右旋转
sonHeadNode := t.right.rightRotate()
t.right = sonHeadNode
//再以失衡点左旋转
return t.leftRotate()
}
func (t *AVL) LeftThenRightRotate() *AVL { //左旋转,之后右旋转
//以失衡点左结点先左旋转
sonHeadNode := t.left.leftRotate()
t.left = sonHeadNode
//再以失衡点左旋转
return t.rightRotate()
}
func (t *AVL) adjust() *AVL {
if t.right.getHeight()-t.left.getHeight() == 2 {
if t.right.right.getHeight() > t.right.left.getHeight() {
t = t.leftRotate()
} else {
t = t.rightThenLeftRotate()
}
} else if t.left.getHeight()-t.right.getHeight() == 2 {
if t.left.left.getHeight() > t.left.right.getHeight() {
t = t.rightRotate()
} else {
t = t.LeftThenRightRotate()
}
}
return t
}
//添加元素
func (t *AVL) Insert(value int) *AVL {
if t == nil {
newNode := AVL{value, 1, nil, nil}
return &newNode
}
if value < t.value {
t.left = t.left.Insert(value)
t = t.adjust()
} else if value > t.value {
t.right = t.right.Insert(value)
t = t.adjust()
} else {
fmt.Println("the node exit")
}
t.height = max(t.left.getHeight(), t.right.getHeight()) + 1
return t
}
/*删除元素
*1、如果被删除结点只有一个子结点,就直接将A的子结点连至A的父结点上,并将A删除
*2、如果被删除结点有两个子结点,将该结点右子数内的最小结点取代A。
*3、查看是否平衡,该调整调整
*/
func (t *AVL) Delete(value int) *AVL {
if t == nil {
return t
}
compare := value - t.value
if compare < 0 {
t.left = t.left.Delete(value)
} else if compare > 0 {
t.right = t.right.Delete(value)
} else { //找到结点,删除结点()
if t.left != nil && t.right != nil {
t.value = t.right.getMin()
t.right = t.right.Delete(t.value)
} else if t.left != nil {
t = t.left
} else { //只有一个右孩子或没孩子
t = t.right
}
}
if t != nil {
t.height = max(t.left.getHeight(), t.right.getHeight()) + 1
t = t.adjust()
}
return t
}
//按顺序获得树中元素
func (t *AVL) getAll() []int {
values := []int{}
return addValues(values, t)
}
//将一个节点加入切片中
func addValues(values []int, t *AVL) []int {
if t != nil {
values = addValues(values, t.left)
values = append(values, t.value)
fmt.Println(t.value, t.height)
values = addValues(values, t.right)
}
return values
}
//查找子树最小值
func (t *AVL) getMin() int {
if t == nil {
return -1
}
if t.left == nil {
return t.value
} else {
return t.left.getMin()
}
}
//查找子树最大值
func (t *AVL) getMax() int {
if t == nil {
return -1
}
if t.right == nil {
return t.value
} else {
return t.right.getMax()
}
}
//查找最小结点
func (t *AVL) getMinNode() *AVL {
if t == nil {
return nil
} else {
for t.left != nil {
t = t.left
}
}
return t
}
//查找最大结点
func (t *AVL) getMaxNode() *AVL {
if t == nil {
return nil
} else {
for t.right != nil {
t = t.right
}
}
return t
}
//得到树高
func (t *AVL) getHeight() int {
if t == nil {
return 0
}
return t.height
}
func max(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
func main() {
bsTree := AVL{100, 1, nil, nil}
newTree := bsTree.Insert(60)
newTree = bsTree.Insert(120)
newTree = bsTree.Insert(110)
newTree = bsTree.Insert(130)
newTree = bsTree.Insert(105)
fmt.Println(newTree.getAll())
newTree.Delete(110)
fmt.Println(newTree.getAll())
}