红黑树,二叉平衡树数据结构的变种,是搜索效率和插入删除效率的中间妥协产物,在保证搜索效率O(log2n)的基础上,减少插入和删除频繁平衡树结构带来的性能开销。包含以下五点性质:
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶结点,即空结点(NIL)是黑的。
4)红色节点的子节点必须是黑色,保证了相邻节点不能同为红色,但可以是黑色
5)对每个结点,从该结点出发到叶子节点的所有路径上包含相同数目的黑结点。
其中前三点是能够轻易保证的,但是在插入和删除时会打破定义45,因此为了保证满足定义,需要红黑树实现自平衡,通过左旋和右旋(调节父子关系)来实现平衡。
固定父节点右旋(父子关系对调,子节点绕着父节点顺时针旋转),左旋对称同理
固定祖父节点右旋(祖父和父节点的父子关系对调,与上同理),左旋对称同理
插入情况分三种:插入节点默认为红色
1)父节点是黑色,直接插入,不作其他操作
2)父节点是红色,父节点的兄弟节点即叔节点也是红色,修改父节点和叔节点为黑色,祖父节点为红色,以祖父节点作为新的插入节点,迭代插入过程
3)父节点是红色,叔节点为黑色,其中包括四种情况:LL、RR、LR、RL,表示祖父节点与父节点、插入节点的关系,例如LR代表祖父节点的左孩子是父节点,父节点的右孩子是插入节点
i. LL :固定祖父节点右旋,祖父节点变红色,父节点变黑色
ii. RR:与i是对称关系,固定祖父节点左旋,变色处理相同
iii LR: 固定父节点左旋,再固定祖父节点右旋,插入节点变黑色,祖父节点变红色
iv RL: 与iii是对称关系,固定父节点右旋,再固定祖父节点左旋,变色处理相同
以一个例子来说明,如下图所示:依次插入35、25、15、9、22、5、20、24、21
1)插入35,根节点为黑色,不做其他处理,结果如下
2)插入25、15,插入25时父节点为黑色(case 1),不作处理,插入15时满足LL(case 3-i),固定祖父节点对父节点右旋,最后父节点变黑色,祖父节点变红色,结果如下
3)插入9,父节点和叔节点为红色(case 2),父叔变黑,祖父变红(变色时可以加判断,若为根节点则变黑色),迭代过程,这里可以设置终止条件(如果插入节点的祖父节点不存在,则停止迭代),结果如下
4)插入22,父节点是黑色(case 1),不做其他处理
5)插入5,父叔为红(case 2),则父叔变黑,祖父变红,以祖父节点作为插入节点迭代过程,由于祖父节点为空这里直接终止了
6)插入20,24,父节点为黑色(case 1),不做其他操作
7)插入21,同理需要变色(case 2),然后以祖父节点作为插入节点插入,符合LR(case 3 -iii),固定插入节点的父节点左旋,然后以插入节点的祖父节点为基础右旋,最后插入节点变黑色,祖父节点变红色