介绍
红黑树是一种自平衡二叉查找树,是一种扩充的BST,它可以在O( log 2 n \log_2{n} log2n)时间进行查找,插入,和删除等操作。主要是对内存中,比较小规模的数据进行索引。
- 性质
- 颜色特征: 结点是红色或者黑色的;
- 根特征: 根结点永远是黑色的;
- 外部特征: 扩充外部的叶子结点是空的,颜色为黑;
- 内部特征: 红色结点的两个子结点都是黑色的,不允许两个连续的红色结点;
- 深度特征: 任何结点到其子孙外部结点的每条简单路径都包含相同数目的黑色结点。
- 红黑树的阶(rank,也称黑色高度)
结点X的阶
- 从X结点到外部结点的黑色结点数量;
- 不包括X结点本身,包括叶子结点。
红黑树的插入
插入需要用到的一些操作
- 变色:即红黑变色。
- 左旋转:将结点想左下方移动一格,让原来的右结点代替它的位置。
- 右旋转:与左旋转相反。
插入:调用BST的插入算法
- 把新插入的结点颜色着色为红色(思考为什么着色为红色?)
- 若插入的结点为根结点,直接把此结点涂为黑色
- 若父亲结点为黑色,则算法结束,否则双红调整
双红调整分为以下两种情况
情况1: 新增的结点X的叔父是黑色的
通过右旋转然后变色
红色结点的位置又分为四种情况,分别调整:
情况2:新增结点x的叔父是红色(如图)
祖父换色,对于叔父来说红色变为黑色之后并不影响其子树,然后以父亲为当前结点进行红红检查,之后情况与情况1中的四种相似,可进行重构调整,保持其祖父的颜色不变,不会破坏其他分支。
删除
后序补充
问题
对于插入情况2中,假如红红检查之后其叔父的结点仍然是红色的,之后也是红色的怎么办?