简介
红黑树是一种特殊的二叉搜索树
相较于平衡二叉树,在综合性能上红黑树更为优秀。只要满足红黑树的条件,我们就可以达成一颗近似平衡的二叉树
我们在Jdk1.8版本后,我们能发现的HashMap的数据结构从数组加链表的形式转化为数组加链表加红黑树的形式,为的就是通过一颗相对平衡的二叉树来提高搜索效率。
红黑树的基本条件
- 树根为黑色
- 不能有连续的两个红色
- 所有NULL节点(叶子节点)都为黑色
- 所有节点到叶子节点的路径上的黑色节点数量相同
红黑树的搭建
所有新插入的节点默认为红色(因为插入黑色必定会破坏红黑树性质导致重新平衡转换,而红色可以减少这样的次数)
- 插入节点为根节点:直接插入
- 插入节点的父节点为黑色:直接插入
以上两种情况都不需要进行调整
插入节点的父节点为红色
这个时候分成三种情况(有人分为五种情况,我认为是三种,这样更容易记忆)
1.叔叔节点为红色
当父亲为红时爷爷节点一定为黑,否则不符合红黑树条件
调整方式:父亲节点和叔叔节点都变成黑色,爷爷节点变成红色
2.叔叔节点为黑色,插入的节点在外侧
图中这种情况我称之为外侧
调整策略:
父亲节点和爷爷节点换色,然后以爷爷节点为旋转点向着另一侧没有插入节点的一侧旋转
2.叔叔节点为黑色,插入的节点在内侧
图中这种情况我称之为内侧
调整策略:
父节点和插入节点换位,即以父节点为旋转点向外侧旋转,转成上一种外侧情况,再按照外侧情况进行调整
红黑树的删除
相较于搭建,红黑树的删除会稍微复杂一些
当我们删除节点后我们一般要选择删除节点的后继节点来顶替被删除的位置,同时要转换为被删除节点的颜色
这个过程其实相当于删除了后继节点
所以我们将以后继节点的位置作为调整的位置
- 当后继节点为红色时,直接删除
- 当后继节点为黑色时,我们需要进行树的重新调整,因为一个黑色节点的消失意味着这条路径上的黑色节点数量于其他路径长度不一致
接下来讨论后继节点为黑色时我们的调整策略
1.兄弟节点为红色
- 父亲节点和兄弟节点换色
- 向被删除一侧旋转补齐
2.兄弟节点为黑色
2.1
- 兄弟节点变红
2.2
- 兄弟节点和红色侄子节点换色
- 兄弟节点向外侧旋转
- 父亲节点变黑色,新兄弟节点变红色
- 父亲节点向被删除一侧旋转
- 新红色侄子变黑
2.3
- 父亲节点变黑色,兄弟节点变红色
- 父亲节点向被删除一侧旋转
- 红色侄子变黑
2.4
- 父节点和叔叔节点换色
- 父亲节点向被删除一侧旋转
- 外侧红孩子变黑