概述:在程序中随处可见的数据结构,红黑树的应用十分广泛,红黑树是一种自平衡的二叉树,目的是为了降低二叉树的层高,提高搜索效率。
一、使用场景
1.C++中的std::map
2.nginx
3.定时器,利用红黑树的顺序
4.cfs进程调度,将各个进程添加到红黑树,每次从红黑树最左节点进程执行
5.内存管理,每分配一块内存,将内存块添加到红黑树
二、用法
1.key -> value,着重于查找
2.利用红黑树的中序遍历,红黑树是有顺序的
三、红黑树性质
1.每个节点是红的或者黑的
2.根节点是黑的
3.每个叶子节点是黑的
4.如果一个节点是红的,则它的两个儿子都是黑的
5.对每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑节点
四、红黑树定义
1.节点定义
// 红黑树节点
typedef int KEY_TYPE
typedef struct _rbtree_node {
unsigned char color;
struct _rbtree_node *left;
struct _rbtree_node *right;
struct _rbtree_node *parent;
KEY_TYPE key;
void *value;
}
2.树的定义
// 红黑树
typedef struct _rbtree {
rbtree_node *root;
rbtree_node *nil;
}
五、红黑树节点旋转
左旋:改变三个方向,动六根指针
x的右子树指向y的左子树
y的父节点指向x的父节点
y的左子树指向x
// 左旋代码
void _left_rotate(rbtree *T, rbtree_node *x) {
rbtree_node *y = x->right;
// 方向1
x->right = y->left;
y->left = x;
if (y->left != T->nil) {
y->left->parent = x;
}
// 方向2
y->parent = x->parent;
if (x->parent == T->nil) {
T->root = y;
} else if (x == x->parent->left) {
x->parent->left = y;
} else {
x->parent->right = y;
}
// 方向3
y->left = x;
x->parent = y;
}
右旋:改变三个方向,动六根指针
y的左子树指向x的右子树
x的父节点指向y的父节点
x的右子树指向y的左子树
// 右旋代码
void _right_rotate(rbtree *T, rbtree_node *y) {
rbtree_node *x = y->left;
// 方向1
y->left= x->right;
x->right= y;
if (x->right != T->nil) {
x->right->parent = y;
}
// 方向2
x->parent= y->parent;
if (y->parent == T->nil) {
T->root = x;
} else if (y == y->parent->right) {
y->parent->right= x;
} else {
y->parent->left= x;
}
// 方向3
x->right= y;
y->parent = x;
}
待补充。