1. 红黑树
1.1 概念
具有以下几种性质的树被称为红黑树:
- 结点只有两种颜色,黑色或者红色;
- 根结点一定是黑色
- 叶子结点为黑色,其中叶子结点包括(NIL:表示无值的点)
- 每个红色色结点的 两个结点为黑色
- 从任一结点到其自身的叶子结点所有的简单路径包含相同数目的黑色结点
由性质5可以推出
如果一个结点存在黑色子结点,那么该结点肯定有两个子结点。
下图就是一个红黑树:
红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。(优点)
由于每一颗红黑树都是一颗二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息。
1.2 结点的插入
- 插入的结点总是红色结点,这样就不会破坏性质5。
关于插入的关键点:
1.插入的结点总为红色
2.插入结点父结点为黑色,能维持性质
3.插入父结点为红,通过重新着色和旋转总能维持性质
相关概念:
1.父结点:即插入结点位置的上层结点
2.当前结点:正在处理的结点称为当前结点
3.兄弟结点:父亲结点的另一个结点为兄弟结点
4.祖父结点:父结点的上一层结点
插入:
1.红黑树为空,直接插入并且将红色变为黑色,因为根结点一定是黑色
2.插入的key已经存在,直接替换即可,保持原结点的颜色不变
3.插入的key的父结点为黑,直接插入即可
4.插入的key的父结点为红色,该结点一定不是根结点,有祖父结点
根据不同情况进行判断:
4.1 叔叔结点存在且为红
此时:
1.将父结点p和兄弟结点s变黑
2.将pp结点变红,设为当前插入结点
如果pp结点为根结点就必须变黑,使得从根结点到叶子结点的路径黑色+1.
这种情况也是唯一一种增加红黑树黑色结点层数的插入情况。
4.2 叔叔结点不存在或者为黑色结点,此时父结点为祖父结点左子结点
4.2.1 插入结点为父结点的左子结点
将p变为黑
将pp变为红
以p为轴右旋(LL型):即p替换pp结点
4.2.2 插入位置为父结点的右结点
LR型
先左旋,变为LL型
根据LL型原则,将pp变红,I变黑,右旋。
4.3 叔叔结点不存在或为黑色,且父结点为祖父结点的右结点
4.3.1 插入位置为父结点的右结点
RR型
将pp变红色
将p变黑色
以p为轴心左旋
4.3.2 插入结点为父结点的左子结点
RL型
先右旋将I和P位置调换变为RR型
将PP变为红色,I变为黑色,左旋。
2. B树
2.1 概念
1、根结点至少有两个子女;
2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;
3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:┌m/2┐ <= k <= m ;
4、所有的叶子结点都位于同一层。
在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。