zoukankan      html  css  js  c++  java
  • 红黑树

    红黑树,一种特殊的二叉查找树,他的的五个性质:
      每个结点要么是红的,要么是黑的。
      根结点是黑的。
      每个叶结点,即空结点(NIL)是黑的。
      如果一个结点是红的,那么它的俩个儿子都是黑的。
      对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

    定理:一棵含有n个节点的红黑树的高度至多为2log(n+1)

    红黑树插入:

    第一步: 将红黑树当作一颗二叉查找树,将节点插入

    第二步:将插入的节点着色为"红色"

    第三步: 通过一系列的旋转或着色等操作,使之重新成为一颗红黑树

    几种情况:

      父节点是黑色:不破坏性质,不影响
      当前节点的父节点是红色,且当前节点的祖父节点的另一个子节点(叔叔节点)也是红色:

        将“父节点”设为黑色。
        将“叔叔节点”设为黑色。
        将“祖父节点”设为“红色”。
        将“祖父节点”设为“当前节点”(红色节点);即,之后继续对“当前节点”进行操作。

      当前节点的父节点是红色,叔叔节点是黑色,且当前节点是其父节点的右孩子:

        将“父节点”作为“新的当前节点”。
        以“新的当前节点”为支点进行左旋。

      当前节点的父节点是红色,叔叔节点是黑色,且当前节点是其父节点的左孩子:

        将“父节点”设为“黑色”
        将“祖父节点”设为“红色”
        以“祖父节点”为支点进行右旋

    红黑树删除:

    第一步:将红黑树当作一颗二叉查找树,将节点删除。

    第二步:通过"旋转和重新着色"等一系列来修正该树,使之重新成为一棵红黑树。

    几种情况:
      x是"黑+黑"节点,x的兄弟节点是红色。(此时x的父节点和x的兄弟节点的子节点都是黑节点)。

        将x的兄弟节点设为“黑色”。
        将x的父节点设为“红色”。
        对x的父节点进行左旋。
        左旋后,重新设置x的兄弟节点。

      x是“黑+黑”节点,x的兄弟节点是黑色,x的兄弟节点的两个孩子都是黑色。

        将x的兄弟节点设为“红色”。
        设置“x的父节点”为“新的x节点”。

      x是“黑+黑”节点,x的兄弟节点是黑色;x的兄弟节点的左孩子是红色,右孩子是黑色的。

        将x兄弟节点的左孩子设为“黑色”。
        将x兄弟节点设为“红色”。
        对x的兄弟节点进行右旋。
        右旋后,重新设置x的兄弟节点。

      x是“黑+黑”节点,x的兄弟节点是黑色;x的兄弟节点的右孩子是红色的,x的兄弟节点的左孩子任意颜色

        将x父节点颜色 赋值给 x的兄弟节点。
        将x父节点设为“黑色”。
        将x兄弟节点的右子节设为“黑色”。
        对x的父节点进行左旋。
        设置“x”为“根节点”。

  • 相关阅读:
    Redis的基本操作
    Redis下载和安装-windows
    Redis介绍
    day08 网络编程
    day07
    day06
    python day05
    Day04
    windows自带反编译chm文件
    CSS Hack表 各版本IE、chrome、firefox、opera
  • 原文地址:https://www.cnblogs.com/zawjdbb/p/7270305.html
Copyright © 2011-2022 走看看