平衡树基础
树
说明
旋转可调整局部高度而保持中序顺序;AVL、红黑树在此基础上维护平衡约束。
分析
右旋把左孩子提升为局部根,原根变成它的右孩子;左旋操作对称。旋转保持所有节点的中序顺序,因而不会破坏搜索树性质。
右旋把3的左孩子2提为局部根,原根3成为2的右孩子,中序仍为1、2、3。若2原有右子树,必须转接给3的左边;旋转之后AVL还需更新高度,红黑树还需维护颜色。
查看图表代码
适用前提与边界
仅有旋转函数还不是完整平衡树,插入或删除后还需维护高度或颜色约束。 右旋要求当前根与左孩子非空,左旋要求根与右孩子非空;返回的新局部根必须接回父节点或全树根。
示例输入与调用
go
root := &Node{Value: 3, Left: &Node{Value: 2, Left: &Node{Value: 1}}}
fmt.Println(RotateRight(root).Value)运行输出
text
2完整 Go 示例
go
package main
import "fmt"
type Node struct {
Value int
Left, Right *Node
}
func RotateRight(y *Node) *Node {
x := y.Left
y.Left = x.Right
x.Right = y
return x
}
func RotateLeft(x *Node) *Node {
y := x.Right
x.Right = y.Left
y.Left = x
return y
}
func main() {
root := &Node{Value: 3, Left: &Node{Value: 2, Left: &Node{Value: 1}}}
fmt.Println(RotateRight(root).Value)
}继续阅读
- 系统学习
- 系统学习
- 系统学习