红黑树的添加与删除

主脉络参考http://www.cnblogs.com/skywang12345/p/3245399.html#!comments

补图删除操作:https://blog.csdn.net/eson_15/article/details/51144079

R-B Tree的在线生成:http://sandbox.runjs.cn/show/2nngvn8w

数据结构与算法汇总:http://www.cnblogs.com/skywang12345/p/3603935.html

红黑树 R-B Tree

1、红黑树的时间复杂度与特性
  1.1 特性:
    (1):每个节点不是黑色就是红色;
    (2):根节点是黑色
    (3):叶子结点(为空的叶子节点)是黑色
    (4):若一个节点是红色,则其子节点必为黑色,反之不成立
    (5):从一个节点到该节点的子孙节点的所有路径上有相同数目的黑节点。
1.2 时间复杂度:
  (1):红黑树的时间复杂度是O(logn)。
  (2):一颗含有n个节点的红黑树的高度至多为2*log(n+1);

2、左旋与右旋(旋转前后仍然是二叉查找树)
  2.1:对x节点左旋:被旋转的节点成为一个左节点;
  2.2:对x节点右旋:被旋转节点成为一个右节点; 

                               z
   x                          /                  
  / \      --(左旋)-->  x
 y   z                      /
                           y
------------------------------------
                              y
   x                            \                 
  / \      --(右旋)-->       x
 y   z                            \
                                     z
View Code

3、红黑树基本操作--添加

  3.1:RB-Insert:
    找到该节点的插入位置y,并将其染成红色
  3.2:RB-Insert-FixUp
    3.2.1:被插入节点是根节点:着黑;
    3.2.2:被插入节点父节点是黑色,直接插入
    3.2.3:被插入节点父节点是红色
      case1:父节点红,叔叔节点红:
        (1):父节点、叔叔节点设为黑
        (2):祖父节点设为红
        (3):以祖父节点为当前节点,再判断;

      case2:父节点红,叔叔节点黑,插入节点是右孩子;

        (1):以父节点为当前节点
        (2):左旋,再判断;

 

      case3:父节点红,叔叔节点黑,插入节点是左孩子:

        (1):父节点设为黑;
        (2):祖父节点设为红;
        (3):以祖父节点为支点右旋;

 


4、红黑树的基本操作--删除
  4.1:RB-delete:
    (将后继节点设置为与删除节点相同的颜色,这样只处理后继节点原位置处的平衡)
    4.1.1:被删除节点没有儿子,直接删除;
    4.1.2:被删除节点只有一个儿子,直接删除,唯一子节点顶替;
    4.1.3:被删除节点有两个儿子:找右孩子的左孩子,一直找下去(二叉搜索树的删除)。
  4.2:RB-Delete-FixUP:
    4.2.1:x为黑,兄弟节点是红(父节点和兄弟的字节点是黑);
      (1)父节点设红,兄弟设黑,父节点左旋;

 

    4.2.4:x为黑,兄弟节点是黑:
      case1:兄弟两个子节点都是黑:
        (1):兄弟节点设红;
        (2):当前节点更新为祖父节点;

 

      case2:兄弟左节点是红,右节点是黑
        (1):兄弟节点设红,兄弟左子节点设黑;
        (2):以兄弟节点作右旋;

      case3:兄弟左节点任意,右节点是红:

        (1):兄弟节点设为父节点颜色;
        (2):父节点设黑,兄弟右节点设黑;
        (3):以父节点为支点左旋;

 

 5:Java实现:


 

posted @ 2018-04-28 17:07  一碗雪花  阅读(386)  评论(0编辑  收藏  举报