1 介绍
引入:二叉排序树当本来数据列表就已经是有序的,若采用就是蜕化成链表。故引入平衡树,而对于AVL是绝对平衡的,在工业生产中应用较少,故采用平衡规则没有那么严格的相对平衡的红黑树。
本文章主要总结红黑树的性质,应用场景,以及简单的实现一个红黑树的旋转,插入,删除等操作。
应用场景:nginx定时器,内存管理,linux内核线程调度,hashmap等
常见的两种工业用法:
1 以key_value方式主要用于查找,性能快O(logn)
2 使用中序遍历,得到有序数据。
2 定义性质
1:每个节点是红的或者黑的
2:根节点是黑色的
3:每个叶子节点是黑的
4:如果一个节点是红的,则它的两个儿子都是黑的
5:对每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑节点
注意:主要平衡的是黑色结点的高度,而红色主要是用来做选择判断用途
3 数据结构
一般情况下业务要与红黑树的性质进行分离的,这里只是为了搞理清流程。故就暂时未分离
结点
typedef int KEY_VALUE;
//结点
typedef struct _rbtree_node{
unsigned char color;//颜色
struct rbtree_node *left; //左子树
struct rbtree_node *right;//右子树
struct rbtree_node *parent; //父结点
KEY_VALUE key;
void *value; //存储具体的数据
}rbtree_node;
红黑树的结构
typedef struct _rbtree