基本概念
红黑树是一种自平衡二叉查找树,和AVL树类似,在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
基本性质
1.节点非红即黑
2.根节点是黑的
3.叶子节点是黑的
4.一个节点是红的,两个儿子都是黑的
5.每个节点,从该节点到子孙节点所有路径上包含相同数目的黑节点
节点的旋转
左旋操作:右孩子节点取代自己,父节点变成自己右孩子的左节点。
右旋操作:左孩子节点取代自己,父节点变成自己左孩子的右节点。
旋转操作的实现主要是针对于3对指针,6个步骤的操作:
r <–> x
x <–> y
y <–> b
step:
- x的右指针,指向b
- b的父指针,指向x
- y的父指针,指向r
- r指针,指向y
- y的左指针,指向x
- x的父指针,指向y
void rbtree_left_rotate(rbtree *r, rbtree_node *x) {
rbtree_node *y = x->right;
x->right = y->left; //1
if (y->left != T->nil) {
y->left->parent = x; //2
}
y->parent = x->parent; //3
if (x->parent == T->nil) {
T->root = y; //4
} else if (x == x->parent->left) {
x->parent->left = y;
} else {
x->parent->right = y;
}
y->left = x; //5
x->parent = y; //6
}
右旋转同理。
节点的添加
添加节点,假设添加的节点是红色的(红色不影响黑色高度规则)
有以下情况:
1.叔节点是红色的->颜色翻转(祖父与父节点颜色翻转)。
2.叔节点是黑色的,此时为了保持树的平衡,需要进行旋转。
- 当前节点是右孩子,左旋转。
- 当前节点是左孩子,右旋转。
coding:
待续。。。
相关的代码实现更新在gayhub: https://github.com/chuican1/RBTree