《STL源码剖析》之RB-tree

本文深入解析了STL中红黑树的插入与删除操作,包括`insert_equal()`和`insert_unique()`的策略以及`_Rb_tree_rebalance()`的调整算法。通过对源码的分析,阐述了红黑树在数据结构中的应用及其优势,如插入只需两次旋转,删除最多三次旋转,是一种高效的平衡二叉搜索树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AVL树之外,另一个被广泛运用的平衡二叉搜索树是RB-tree。所谓红黑树,不仅是一个二叉搜索树,它还满足以下性质:



1. 每个节点是红色或黑色;
2. 根是黑色;

3. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点);
4. 从任一节点到NULL(树尾端)的任何路径都包含相同数目的黑色节点;

5.每个叶子节点(或NIL)均为黑。

为什么选择红黑树作为底层实现

红黑树是一种类平衡树, 但它不是高度的平衡树, 但平衡的效果已经很好了. 补充说明另一种 AVL 树, 我之前的博文: 《编程珠玑,字字珠玑》读书笔记完结篇——AVL树

用过 STL map 么, 你用过 linux 么(这个说大了), 他们都有红黑树的应用. 当你对搜索的效率要求较高,并且数据经常改动的情景,你可以用红黑树, 也就是 map.

至于, 为什么不用 AVL 树作为底层实现, 那是因为 AVL 树是高度平衡的树, 而每一次对树的修改, 都要 rebalance, 这里的开销会比红黑树大. 红黑树插入只要两次旋转, 删除至多三次旋转. 但不可否认的是, AVL 树搜索的效率是非常稳定的. 选取红黑树, 我认为是一种折中的方案.

1 红黑树的插入

插入节点的关键是:
1. 插入 新节点总是红色节点 ;这是为了维护性质4;
2. 如果插入节点的父节点是黑色,能维持性质;
3. 如果插入节点的父节点是红色,破坏了性质。 故插入算法就是通过重新着色或旋转,来维持性质。

假如我们为一棵红黑树分别插入3, 8, 35, 75,如下图所示:


情形1:以左左 外侧 ”插入节点3,且新插入的节点3为红;因为其父节点5为红(不满足性质3),那么仅需对P,G进行一次单旋转,再改变P,G的颜色,此时平衡性质得以维持;如下图所示:


情形2:左右内侧”插入节点8,且新插入的节点8为红;我们先对P,X做一次单旋转,并更改G,X的颜色;再将结果对G做一次单旋转,即可维持平衡的性质;如下图所示:


情形3:S为红且X为外侧插入(讨论一下)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值