一、红黑树
红黑树分成两部分
1、红黑树的插入、删除节点的操作
2、红黑树已经插入、删除节点之后为了保持红黑树原有的红黑特质而坐的恢复与保持红黑特质的操作。
红黑树的特质:
1.红黑红黑,要么是红,要么是黑;
2.根结点是黑;
3.每个叶结点是黑;
4.一个红结点,它的俩个儿子必然都是黑的;
5.每一条路径上,黑结点的数目等同。
五条性质,合起来,来句顺口溜就是:(1)红黑 (2)黑 (3)黑 (4&5)红->黑 黑。
记住:插入节点后把该节点变为红色,这样不改变红黑树的特质5,只会改变特质2(根节点为黑)和特质4(一个节点是红,两个儿子节点为黑)
红黑树的插入 3种情况(都是父结点为红)
1、叔叔结点(父结点的兄弟结点)为红,把父结点和叔叔结点都变成黑,把祖父结点变成红色,再对祖父结点继续处理。
2、叔叔结点为黑,该结点是父结点的右孩子,先左旋,变成情况3,一下参考情况3
3、叔叔结点为黑,该结点是父结点的左孩子,将父结点变黑,祖父结点变红右旋
红黑树的删除 4种情况 (主要是x这边少一个黑色结点导致p[x]左右不平衡,如果删除的是红色结点则不用改变颜色直接return)
mark:(对策是可以想象是:1、让右边少一个黑色结点这样就变成整体少一个黑色结点 -> p[x]变成新的x结点,2、改变p[x]和兄弟结点的颜色,然后左旋,这样的效果是x这边增加一个黑色结点,兄弟结点w这边不变)
1、x的兄弟w是红色
这种情况x的父亲一定是黑色,那么相当于x这边少一个黑结点,和右边不平衡,对策是改变w和p[x]颜色,再对p[x]做一次左旋;x的新兄弟new w是旋转之前w的某个孩子,为黑色,这样x和new w之前又不平衡了,情况转化为2或3、4;
2、x的兄弟w是黑色,且w的两个孩子都是黑色
因为w这边比x这边多一个黑色,所以得去掉一黑色,最后w变红,这样相当于p[x]这边整体删除了一个黑色结点(左右孩子都少一个黑色),p[x]为新的结点x(因为相当于删除了p[x]的父结点)
3、x的兄弟w是黑色,w的左孩子是红色,w的右孩子是黑色
对策:交换w和其左孩子left[w]的颜色。然后右旋,保持红黑性质,现在x的新兄弟w是一个有红色右孩子的黑结点,转化为情况4
4、x的兄弟w是黑色,w的右孩子红色
对策:做颜色修改,p[x]改为黑色,w改为红色,并对p[x]做一次旋转(这样右边多一个黑,右边不变,达到平衡),将x置为根后,循环结束。