文章目录
数据结构与算法——红-黑树
1 为什么需要红-黑树?
普通二叉搜索树,插入新节点后可能导致树的不平衡。
而平衡的二叉树,才能使搜索效率最高。
红-黑树在插入和删除的时候进行了一些特殊的处理,能使二叉树保持平衡。
2 红-黑规则
红-黑树在插入(删除)一个节点时,只有遵循红-黑规则,树才能始终保持平衡。
即 遵循红-黑规则<=>平衡树,把平衡树的问题转变为让树遵循红-黑规则的问题。
① 每一个节点不是红色的就是黑色的。
② 根总是黑色的。
③ 如果节点是红色的,则它的子节点必须是黑色的(反之倒不一定必须为真)。
④ 从根到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即黑色高度相同)。
3 为什么默认插入红色节点?
- 若默认插入红色节点
- 若父节点是黑节点——>不违反红-黑规则
- 若父节点是红节点——>违法红-黑规则③
- 若默认插入黑色节点
- 无论父节点是黑或红——>一定违反红-黑规则④
综上,默认插入红色节点违规率50%,默认插入黑色节点违规率100%,所以默认插入红色节点好。
4 如何修正违规?
(1) [三节点]颜色变换
- 触发:在插入过程中遇到一个黑色节点,并且它还有两个红色子节点,则需要三节点颜色变换。
- 目的:在不违反红-黑规则④的前提下,一是使连接红色节点更方便,二是保证在进行一次或两次旋转操作后整个树仍是正确的红-黑树,三是保证了插入时若父节点(P节点)是红色节点则不可能有兄弟节点(不可能有一个红色兄弟节点,因为有颜色变换;不可能有一个黑色兄弟节点,因为违背红-黑规则④)。
- 缺点:若祖父节点为红色节点,则会违反红-黑规则③。
- 情况
- 情况1:该黑色节点是根节点。
- 情况2:该黑色节点不是根节点。
(2) 单节点颜色改变
- 触发:当父节点和子节点都是红色节点时(红红冲突),由于违背了红-黑规则③,需要改变单个节点的颜色。(单节点颜色变换和旋转是同时出现的,也即旋转触发的情况)
- 目的:单节点颜色改变和旋转一起修正父节点和子节点都是红色的违规问题,广义的旋转包括“单节点颜色改变”和“旋转”。
- 情况