红黑树的插入


前言

    在学习STL的<unordered_map><unordered_set>之前, 我们需要了解红黑树, 红黑树是一种自平衡的二叉查找树(BST),用于维护动态数据集,并在最坏情况下保证基本操作的时间复杂度为 𝑂(log⁡𝑛)


红黑树的特性

特点

    红黑树有一些几个重要特点

  • 符合二叉搜索树的规律
  • 所有的节点只有红色和黑色两种颜色
  • 根节点是黑色
  • 不存在连续的红色节点
  • 每一条路径的黑色节点数目相同
  • 最长路径的节点数不会超过最短路径节点数的二倍

操作与时间复杂度

  • 查找:和普通的二叉查找树类似,时间复杂度为 O(logn)
  • 插入:插入一个新节点后,可能会破坏红黑树的性质,需通过旋转和重新着色来恢复平衡。插入的时间复杂度为 O(logn)
  • 删除:删除节点时,也需要通过调整旋转和重新着色来维护红黑树的性质,时间复杂度同样为𝑂(log𝑛)

红黑树的优势

  • 相较于普通二叉查找树,红黑树在最坏情况下的时间复杂度为 O(logn),而普通二叉查找树可能退化成链表,导致查找时间复杂度为 O(n)
  • 红黑树的平衡性虽然不如 AVL 树那么严格,但它的调整操作通常比 AVL 树更少,因此在插入和删除频繁的场景下,红黑树的性能往往优于 AVL 树。

红黑树的操作

插入

    选择每次插入红色节点, 如果插入黑色节点, 那么必定会破坏每条路径黑色节点数目的平衡, 插入红色节点可能不会破坏平衡, 并且即使破坏平衡, 也可以通过变色或旋转调整

不破坏平衡插入

比如在下面红黑树插入一个2
在这里插入图片描述
插入后没有破坏红黑树的平衡
在这里插入图片描述

破坏平衡&叔叔节点为红色

比如
在这里插入图片描述
插入后
在这里插入图片描述
破坏了平衡, 不能有连续的红色节点, 这种情况就需要变色处理
将父节点和叔节点变成黑色, 爷节点变成红色

在这里插入图片描述
这时, 又破坏了根节点为黑色的规则, 我们再把根节点变黑
在这里插入图片描述

多次调整情况

在这里插入图片描述
插入后破坏平衡
在这里插入图片描述
第一次调整变色

在这里插入图片描述
现在中间也破坏平衡, 继续调整, 这次就属于下面一种情况, 下面再细说
在这里插入图片描述

破坏平衡&叔叔节点不存在或为黑色

LL型

在这里插入图片描述
插入后破坏平衡

在这里插入图片描述
进行右旋操作

在这里插入图片描述
然后将原本的爷节点变红, 父节点变黑
在这里插入图片描述

RR型

比如

在这里插入图片描述
进行左旋并变色
在这里插入图片描述

LR型

比如
在这里插入图片描述
先对父节点进行左旋操作
在这里插入图片描述
再对爷节点进行右旋变色操作
在这里插入图片描述

RL型

比如
在这里插入图片描述
先右旋再左旋变色
在这里插入图片描述

完整插入演示

[17,18,23,34,27,15,9,6,8,5,25]
插入17
在这里插入图片描述
插入18
在这里插入图片描述
插入23 破坏规则
在这里插入图片描述
左旋变色调整
在这里插入图片描述
插入34 破坏规则
在这里插入图片描述
变色调整
在这里插入图片描述
插入27 破坏规则
在这里插入图片描述
先右旋再左旋变色调整

在这里插入图片描述
插入 15
在这里插入图片描述
插入9 破坏规则
在这里插入图片描述
右旋变色调整

在这里插入图片描述
插入6 破坏规则
在这里插入图片描述

变色调整
在这里插入图片描述
插入8 破坏规则
在这里插入图片描述

先左旋再右旋变色调整
在这里插入图片描述
插入5 破坏规则
在这里插入图片描述
变色调整
在这里插入图片描述
继续向上调整, 右旋变色调整

在这里插入图片描述
插入25 破坏规则

在这里插入图片描述
变色调整
在这里插入图片描述
继续向上变色调整
在这里插入图片描述
调整根节点
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值