红黑树概述(插入删除逻辑及其实现)
- 搜索树进化历程
-
二叉搜索树(二叉树,左小右大) 中序遍历 有序排列
-
二叉平衡搜索树(二叉树,平衡因子,左小右大) 中序遍历 有序排列 树的高度可控
- 优点:静态特性最优,二叉平衡搜索树一旦构造完成,查找时效率最高
- 缺点:动态特性差,插入删除节点频率较高会导致旋转次数增加导致效率降低
-
红黑树:在上述基础上加入了颜色约束,具体表示为5个性质,树的高度仍然可控,但是在插入删除时的平衡因子要求没有那么苛刻,旋转频率下降
工程中常用
- 红黑树的应用
- C++ STL中的map、set
- 哈希表的unorder_map、unorder_set
- 红黑树的性质
- 每个节点非黑即红
- 根节点必须是黑色
- 每个叶子节点必须是黑色(此处叶子节点指的是:度为0的节点指向的NULL)
- 如果一个节点是红色的,则它的子节点必须是黑色的(不能有连着的两个红色节点)
- 任何一个节点的黑高相同(该节点到NULL的所有路径上的黑色节点数量相同)

- 红黑树是如何保持平衡的
通过旋转(二叉平衡树的旋转操作)和着色(5个颜色性质)的操作来降低旋转的频率来保持平衡
- 红黑树的插入逻辑
-
将插入节点着色为红色
根据红黑树的五个性质,将插入节点着色为红色,不会违背 特性5 ,少违背一条特性,就少一些要处理的情况,接下来就努力满足其他性质即可
-
如果插入节点是根节点,则将插入节点着色为黑色
-
插入后出现红红节点情况的处理
叔叔节点:父节点的兄弟节点
调整的核心是叔叔节点的颜色
⭐tips:三角形代表下方子树,而不是NULL
-
叔叔节点是红色

解决流程
- 将父节点p设为黑色
- 将叔叔节点u设为黑色
- 将祖父节点g设为红色。
- 将祖父节点设为当前节点。
将矛盾转移成叔叔节点是黑色
-
叔叔节点是黑色
-
LL:右旋g

- 将父节点设为黑色
- 将祖父节点设为红色
- 以祖父节点为支点进行右旋
-
LR:左旋p

又回到了LL状态,解决方式相同 -
RR,RL同理只不过反了个方向
-
-
-
红黑树的删除逻辑
待删除节点y,替换节点x
-
y是红色,x是黑色,直接用x替换y即可(颜色数值都替换)
-
y是黑色,x是红色,那就用x的值把y的值覆盖掉即可(颜色不用改变)
-
y和x均为红色不可能出现(红黑树中不能出现两个连续的红红节点)
-
y和x均为黑色则涉及到双黑节点(因为原红黑树中的黑高都是一样的,删除掉黑色节点以后会导致黑高发生变化,故而引进双黑节点保证黑高相同):具体情况如下
一个重要逻辑,保证有同向红节点(用来接收颜色转换的黑色节点)
双黑节点情况:
-
当节点x是双黑节点且不是根节点
-
x的兄弟节点w是黑色且w的孩子节点至少有一个是红色的
对于这种情况,需要对x的兄弟节点w进行旋转操作,将w的一个红色节点用r表示,x和w的父节点用p表示,那么p,w和r将可能出现四种可能性(LL、LR、RR、RL)
- 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的旋转操作一致。
- LR情况(w是p的左孩子,r是w的右孩子)

其他与LL都相同,只不过要先以w为轴旋转得到同向红节点,在进行与LL相同的操作即可。

接下来的RR、RL与上述情况类似,只不过反了个方向。
- LL情况(w是p的左孩子,r是w的左孩子,或者w的两个孩子都是红色)
-
x的兄弟节点是黑色且它的两个孩子都是黑色的
对于这种情况需要递归地进行处理,如果删除节点后得到的双黑节点的父节点此时为黑色,则节点u变单黑,且节点u的父节点p变双黑,然后对节点u的父节点p继续进行处理,直到当前处理的双黑节点的父节点为红色节点,此时将双黑节点的父节点设置为黑色,双黑节点变为单黑节点。
(红色 + 双黑 = 单黑)
通俗理解:也是转移矛盾的思路,因为在当前范围内没有红节点可以用来存放黑高,那就把根节点变为双黑节点,把原来双黑节点的兄弟节点变为红色,递归到上一层解决问题,就又回到了上一种情况。

-
x的兄弟节点w是红色节点


-
当前节点x是双黑节点且是根节点
与上述情况一致,向上递归继续找红节点即可
-
-
-
181

被折叠的 条评论
为什么被折叠?



