树
红黑树
为何引入红黑树(RBT)
平衡二叉树AVL:插入/删除很容易破坏“平衡”特性,需要频繁调整树的形态。如:插入操作导致不平衡,则需要先计算平衡因子,找到最小不平衡子树(时间开销大),再进行LL/RR/LR/RL调整。
红黑树RBT:插入/删除很多时候不会破坏“红黑”特性,无需频繁调整树的形态。即便需要调整,一般都可以在常数级时间内完成
RBT定义
首先,红黑树是一个二叉排序树。其次,需要满足以下的条件:
①每个结点或是红色,或是黑色的
②根节点是黑色的
③叶结点(外部结点、NULL结点、失败结点)均是黑色的
④不存在两个相邻的红结点(即红结点的父节点和孩子结点均是黑色)
⑤对每个结点,从该节点到任一叶结点的简单路径上,所含黑结点的数目相同
这里需要注意的是,我们所说的第三条指的是查找失败的节点均是黑色的,如下图所示:
RBT的插入规则
- 先查找,确定插入位置(原理同二叉排序树)。
- 插入新结点是根——染为黑色;新结点非根——染为红色。
- 若插入新结点后依然满足红黑树定义,则插入结束。
- 若插入新结点后不满足红黑树定义,需要调整,使其重新满足红黑树定义。
- 叔叔结点是黑色:旋转+染色
- LL型:右单旋,父换爷+染色
- RR型:左单旋,父换爷+染色
- LR型:左、右双旋,儿换爷+染色
- RL型:右、左双旋,儿换爷+染色
- 叔叔结点是红色:染色+变新
- 叔叔结点是黑色:旋转+染色
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 张恩硕的网站!