写在前面:
一,本文侧重诠释对算法的思考记录过程,忽略其他诸如代码简洁、字符编码等细节问题。
二,本文结合 红黑树插入过程图示 这篇一起看,有助于理解。
package main
import "fmt"
type Node struct {
Data int
Left *Node
Right *Node
Color int
Parent *Node
}
//红黑树(Red-Black Tree)是每个节点都带有颜色属性的二叉排序(查找)树,具备以下特性:
//1,节点是红色或黑色
//2,根节点是黑色的
//3,每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据
//4,任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的
//5,每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点
type RbTree struct {
Tree *Node
}
const (
RED = 1
BLACK = 0
)
//中序遍历
func (t *RbTree) MidOrderTraverse(tree *Node) {
if tree == nil {
return
}
if tree.Left != nil {
t.MidOrderTraverse(tree.Left)
}
fmt.Println(tree)
if tree.Right != nil {
t.MidOrderTraverse(tree.Right)
}
}
//插入节点
func (t *RbTree) Insert(data int) {
//如果是空树,就插入到根节点
if t.Tree == nil {
t.Tree = &Node{
Data: data}
return
}
tree := t.Tree
for tree != nil {
if data < tree.Data {
if tree.Left == nil {
tree.Left = &Node{
Data: data, Color: RED, Parent: tree}
t.ChangeColor(tree.Left)
return
}
tree = tree.Left