理解红黑树的节点插入和删除
红黑树是计算机常用数据结构,在 Linux 内核进程调度,Nginx 定时器管理中均有使用
红黑树的查找时间为O(lgn),与Hash相比,其优势在于:节约存储空间,其数据具有连续性,可以查找一个范围的数据
红黑树的难点在于插入和删除,在很多算法书中,对其颜色调整讲得比较粗略,不易于理解,本文主要是按照作者的理解,对其插入和删除过程进行推导,演变方式与算法书中可能会有些差异,欢迎大家进行讨论
红黑树的基本性质
- 每个结点为红色或者黑色
- 根结点为黑色
- 每个叶结点为黑色*
- 如果一个结点为红色,则它的两个子结点为黑色
- 对每个结点,从该结点到其后代叶子节点的简单路径上,均包含相同数目的黑色结点
*这里的叶结点不是指用户在树最底层插入的新结点点,而是插入新结点后,新结点的两个为 nil 的左右孩子
红黑树的这 5 个性质,保证红黑树尽量趋近于平衡:
- 第 5 条,如果去掉红黑树中的红色结点,其剩余的黑色结点必然是一个完全平衡二叉树
- 第 4 条,保证不能出现相邻的两个结点都为红色,加上第 2 条中的根节点为黑色,保证红黑树中的红色结点尽量的少
红黑树在搜索,寻找前继结点,寻找后继,插入和删除结点,这些操作与二叉搜索树基本是相同的,区别在于插入和删除后,会破坏红黑树的性质,因此需要对红黑树进行调整来恢复红黑树的性质。本文主要探讨的就是在插入和删除结点后如何对红黑树进行调整
红黑树的基本操作
红黑树的结点颜色
按照红黑树的性质,红黑树的结点有两种颜色,红色和黑色,另外红黑树删除过程中,结点还有一种中间态,叫双黑结点,我们分别表示为:
- 红色:color = 0
- 黑色:color = 1
- 双黑:color = 2
这种表示方式是根据红黑树的性质 5 进行设定的,便于我们计算从一个结点到它的后代叶子节点路径上的黑色结点数。如下图
A 为一个红色结点,color = 0
B 为一个黑色结点,color = 1
C 为一个双黑结点,color = 2
A 的父节点到 nil1 和 nil2 经过的黑点树即为 0 + 1 + 2 &#