插入点为x, 父结点为p, 伯父节点为w,爷爷节点为g.
插入操作:
1. 伯父结点为红色
2. 伯父结点为黑色
伯父结点为红色:
若伯父节点为红色,则爷爷节点为黑色。(爷爷结点黑色,父亲、伯父结点红色)
同时将伯父w与父亲p结点置为黑色,这样,插入点x与父亲p结点处平衡(即红-红消失),但爷爷g结点相对于其兄弟则多了
一个黑色结点,此时爷爷结点为黑色,则置为红色。但爷爷结点为红色后,可能平衡,也可能不平衡,因为如果爷爷的爸爸为红色,
那就不平衡,所以新一轮迭代相当于将插入了爷爷节点,即将爷爷结点视为x,进行新一轮迭代。
伯父节点为黑色:
1. 外侧插入
为消除x 与 p的红-红性,可以将p置为黑色,这样左支相对于w支多了一个黑色结点。可以通过将爷爷结点g置为红色,然后以g为旋转点,
将g旋转下来(右旋),平衡性得以保持。
2. 内侧插入
左旋,转变为情形1进行处理。
删除操作:
删除相对于插入,则较为复杂。
普通二叉查找树删除一个结点后,如果右子树存在,则从右子树中寻找最小值结点替换删除结点(右子树最左结点)。
这样就保证了替换结点为单支;如果右子树不存在,则儿子结点替换父结点。情况2处理情况包含在情况1中。
对于情况1(右子树存在):可以这样假想,替换结点与欲删结点仅交换数据,不变更颜色,这样,相当于要删除替换结点,
而替换结点肯定是一个单支节点。
平衡的红黑树中,单支情况只有上述一种情况,其它情况均不满足:任意结点到空结点的任意路径,黑结点数目相等。
1. 若删除红结点,则不影响平衡性,直接删掉即可。
上图中,欲删除结点y。用x 替换 y, 然后互换 x 与 y颜色。如果删除节点 y 颜色为红色,则直接删除,不影响平衡性。
2. 若删除黑结点,则黑色结点数量变少,失去平衡,需要调整。
调整方法比较复杂,只需要记住,将树的形状尽量调整为伯父节点w的右儿子为红色,此种情况有解。
情况1:(下图中已经将y删除,x替换了y的位置,而删除的y颜色为黑色)
x的伯父w为红色,旋转,使x的伯父为黑色,因为x的伯父右儿子为红色的时候有解。
情况2:
伯父为黑色,且两个儿子都是黑色,则伯父置红,这样子树x, w黑色节点数一致,但c相对于其兄弟少一个黑色,
将c置为x(new x),下一轮迭代。
情况3:
w右儿子为黑色,左儿子为红色,旋转,变成情况4,即右儿子为红色。
情况4:
w的右儿子为红色,左儿子颜色任意,交换c 与 w颜色,左旋,并将E,即w的右儿子置黑,这样,用这个黑色填补失去的那个黑色,达到平衡。