[[算法导论]红黑树速记

红黑树的性质:

  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的颜色设为黑色。

    

posted @ 2015-02-21 09:50  TimCheng  阅读(300)  评论(0编辑  收藏  举报