zoukankan      html  css  js  c++  java
  • 红黑树的添加与删除

    主脉络参考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实现:


  • 相关阅读:
    通过JDBC连接oracle数据库的十大技巧
    asp.net里导出excel表方法汇总
    流式媒体
    html 另存为/打印/刷新/查看原文件等 代码
    JSP 语法详解
    让一个网页打开的同时自动为另一个网页自动填写表单并提交
    StreamWriter输出中文乱码的问题
    “mailto”的六则应用技巧
    返回目录大小
    JDBC基础(二)
  • 原文地址:https://www.cnblogs.com/whtblog/p/8968798.html
Copyright © 2011-2022 走看看