红黑树概述及插入删除逻辑

红黑树概述(插入删除逻辑及其实现)

  • 搜索树进化历程
  1. 二叉搜索树(二叉树,左小右大) 中序遍历 有序排列

  2. 二叉平衡搜索树(二叉树,平衡因子,左小右大) 中序遍历 有序排列 树的高度可控

    1. 优点:静态特性最优,二叉平衡搜索树一旦构造完成,查找时效率最高
    2. 缺点:动态特性差,插入删除节点频率较高会导致旋转次数增加导致效率降低
  3. 红黑树:在上述基础上加入了颜色约束,具体表示为5个性质,树的高度仍然可控,但是在插入删除时的平衡因子要求没有那么苛刻,旋转频率下降

    工程中常用

  • 红黑树的应用
  1. C++ STL中的map、set
  2. 哈希表的unorder_map、unorder_set
  • 红黑树的性质
  1. 每个节点非黑即红
  2. 根节点必须是黑色
  3. 每个叶子节点必须是黑色(此处叶子节点指的是:度为0的节点指向的NULL)
  4. 如果一个节点是红色的,则它的子节点必须是黑色的(不能有连着的两个红色节点)
  5. 任何一个节点的黑高相同(该节点到NULL的所有路径上的黑色节点数量相同)
    在这里插入图片描述

  • 红黑树是如何保持平衡的

通过旋转(二叉平衡树的旋转操作)和着色(5个颜色性质)的操作来降低旋转的频率来保持平衡

  • 红黑树的插入逻辑
  1. 将插入节点着色为红色

    根据红黑树的五个性质,将插入节点着色为红色,不会违背 特性5 ,少违背一条特性,就少一些要处理的情况,接下来就努力满足其他性质即可

  2. 如果插入节点是根节点,则将插入节点着色为黑色

  3. 插入后出现红红节点情况的处理

    叔叔节点:父节点的兄弟节点

    调整的核心是叔叔节点的颜色

    ⭐tips:三角形代表下方子树,而不是NULL

    • 叔叔节点是红色
      在这里插入图片描述

      解决流程

      1. 将父节点p设为黑色
      2. 将叔叔节点u设为黑色
      3. 将祖父节点g设为红色。
      4. 将祖父节点设为当前节点。

      将矛盾转移成叔叔节点是黑色

    • 叔叔节点是黑色

      • LL:右旋g

        在这里插入图片描述

        1. 将父节点设为黑色
        2. 将祖父节点设为红色
        3. 以祖父节点为支点进行右旋
      • LR:左旋p
        在这里插入图片描述
        又回到了LL状态,解决方式相同

      • RR,RL同理只不过反了个方向

  4. 红黑树的删除逻辑

    待删除节点y,替换节点x

    1. y是红色,x是黑色,直接用x替换y即可(颜色数值都替换)

    2. y是黑色,x是红色,那就用x的值把y的值覆盖掉即可(颜色不用改变)

    3. y和x均为红色不可能出现(红黑树中不能出现两个连续的红红节点)

    4. y和x均为黑色则涉及到双黑节点(因为原红黑树中的黑高都是一样的,删除掉黑色节点以后会导致黑高发生变化,故而引进双黑节点保证黑高相同):具体情况如下

      一个重要逻辑,保证有同向红节点(用来接收颜色转换的黑色节点)

      双黑节点情况:

      1. 当节点x是双黑节点且不是根节点

        1. x的兄弟节点w是黑色且w的孩子节点至少有一个是红色的

          对于这种情况,需要对x的兄弟节点w进行旋转操作,将w的一个红色节点用r表示,x和w的父节点用p表示,那么p,w和r将可能出现四种可能性(LL、LR、RR、RL)

          1. LL情况(w是p的左孩子,r是w的左孩子,或者w的两个孩子都是红色)
            在这里插入图片描述

          tips:此时在p w r这条路中,r对于p w来说就是同向红节点,而18节点对于p w来说则时异向红节点。

          如图所示,要删除掉25节点时,x与y都是黑色节点,为保持这一棵子树中黑高一致,将a节点变为双黑节点并进行如下操作:

          ​ r的颜色变为w的颜色,w的颜色变为p的颜色,此时p变为黑高为0的空白节点。要将双黑节点中的一个黑色给p;但是直接给的话会导致以p为根节点的树两边黑高不等,并且也会影响p上方树的黑高。因此需要旋转操作。图中的情况是LL则以p为根节点进行右旋,然后再将双黑节点a的一个黑色给空白节点p,由此完成了LL的删除操作。旋转与BST的旋转操作一致

          1. LR情况(w是p的左孩子,r是w的右孩子)

          在这里插入图片描述

          ​ 其他与LL都相同,只不过要先以w为轴旋转得到同向红节点,在进行与LL相同的操作即可。
          在这里插入图片描述

          接下来的RR、RL与上述情况类似,只不过反了个方向。

        2. x的兄弟节点是黑色且它的两个孩子都是黑色的

          对于这种情况需要递归地进行处理,如果删除节点后得到的双黑节点的父节点此时为黑色,则节点u变单黑,且节点u的父节点p变双黑,然后对节点u的父节点p继续进行处理,直到当前处理的双黑节点的父节点为红色节点,此时将双黑节点的父节点设置为黑色,双黑节点变为单黑节点。

          (红色 + 双黑 = 单黑)

          通俗理解:也是转移矛盾的思路,因为在当前范围内没有红节点可以用来存放黑高,那就把根节点变为双黑节点,把原来双黑节点的兄弟节点变为红色,递归到上一层解决问题,就又回到了上一种情况。
          在这里插入图片描述

        3. x的兄弟节点w是红色节点
          在这里插入图片描述在这里插入图片描述

        4. 当前节点x是双黑节点且是根节点

          与上述情况一致,向上递归继续找红节点即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值