//------------------------------------------------------------------------------
// rbtree.go
// 红黑树
//------------------------------------------------------------------------------
package rbmap
const (
RED bool = true
BLACK bool = false
)
type node struct {
key int64
value interface{}
left *node
right *node
parent *node
color bool
}
var nilnode = &node{
color: BLACK,
}
type rbtree struct {
root *node
}
// 搜索key
func search(x *node, k int64) *node {
if x == nilnode || k == x.key {
return x
}
if k < x.key {
return search(x.left, k)
} else {
return search(x.right, k)
}
}
// 最小key元素
func maximum(x *node) *node {
for x.left != nilnode {
x = x.left
}
return x
}
// 最大key元素
func minimum(x *node) *node {
for x.right != nilnode {
x = x.right
}
return x
}
// 结点x的后继及结点
func successor(x *node) *node {
if x.right != nilnode {
return minimum(x)
}
y := x.parent
for y != nilnode && x == y.right {
x = y
y = y.parent
}
return y
}
func remove(T *rbtree, z *node) *node {
x := nilnode
y := nilnode
if z.left == nilnode || z.right == nilnode {
y = z
} else {
y = successor(z)
}
if y.left != nilnode {
x = y.left
} else {
x = y