[[算法导论]红黑树速记
红黑树的性质:
1.每个结点要么是红色要么是黑色的。
2.根结点是黑色的。
3.所有叶结点(nil)是黑色的。
4.每个红色结点的两个孩子都是黑色的。
5.每个结点到其后代叶结点的简单路径上均包含相同数目的黑色结点。
INSERT操作按二叉搜索树的方法插入新结点。
INSERT-FIXUP(三种情况):
插入后新结点(z)为红色,当z.p==z.p.p.left时.
循环条件:父结点为红色。
情况1:叔结点(z.p.p.right)为红色。
父结点和叔结点改为黑色,祖父结点改为红色并成为新的z结点进入下一次循环。
情况2:叔结点为黑色,z为右孩子结点。
将z的父结点设为新的z结点,按该点左旋转,变为情况三。
情况3:叔结点为黑色,z为左孩子结点。
父结点的颜色改为黑色,祖父结点改为红色,按祖父结点右旋。
DELETE操作按二叉搜索树的方法删除结点。如结点只有一个孩子结点,用该孩子结点替代,如有两个孩子结点,用右子树的最小结点替代。
DELETE-FIXUP(四种情况):
删除z结点,用y结点替代,y结点原来的位置用x结点为根的子树补上。当z只有一个孩子结点时,y就是z,x为其孩子结点,当z有两个孩子结点时,x为y的右孩子。
当被移动的y结点为黑色时,使得x具有双重颜色,调用DELETE-FIXUP(x)。
当x==x.p.left时:
循环条件:x不是根结点且x的颜色为黑色。
情况1:x的兄弟结点(w)为红色。
兄弟结点改为黑色,父结点改为红色,左旋。
w重新指向x的兄弟结点,此时w的颜色为黑色。转为情况2、3、4。
情况2:w为黑色,w的两个孩子结点都为黑色。
w的颜色改为红色,x重新指向x的父结点。
情况3:w为黑色,w的右孩子的颜色为黑色,左孩子为红色。
w左孩子的颜色改为黑色,w的颜色改为红色,右旋,w重新指向x的兄弟结点,转变为情况4。
情况4:w为黑色,w的右孩子的颜色为红色,左孩子为黑色。
父结点的颜色赋予w,父结点改为黑色,w的右孩子改为黑色,左旋。
x设为根结点,终止循环。
退出循环后x的颜色设为黑色。