






















12(B)
/ \
6(R) 16(R)
/ \ / \
2(B) 10(B) 14(B) 20(B)
/ \ / \ / \ / \
NIL 5(R) NIL NIL NIL NIL 19(R) 25(R)
/ \ / \ / \
NIL NIL NIL NIL NIL NIL
红黑树本质上是一棵二叉排序树,除了具有二叉排序树所具备的特性外,还具有其他一些特性,下面对红黑树的性质做个总结:
性质 4) 和 5) 使得红黑树有了一个关键特性:从根到叶子的最长的可能路径不多于最短的可能路径的两倍。性质 4) 使得路径中不能有两个连续的红色结点,最短的可能路径中全是黑色结点,最长的可能路径中有交替的红色和黑色结点。性质 5) 规定所有结点到其每个叶子结点的所有简单路径都包含相同数目的黑色结点,这就表明了没有路径能多于任何其他路径的两倍。因此红黑树在结构上是一棵大致平衡的二叉排序树,具有很高的查找效率。一般含有 n 个结点的红黑树的高度至多为 2log(n+1),红黑树上的查找时间复杂度为 O(logn)。
红黑树是一个附加了一些约束的二叉排序树,因此红黑树上的只读操作(查找)与普通的二叉查找树的只读操作相同。然而,在红黑树上进行插入和删除操作可能会导致其不再符合红黑树的特性,因此树在插入、删除结点之后可能需要一些调整操作使之恢复特性。恢复红黑树的特性需要少量的颜色变更[时间复杂度为 O(logn)]和不超过三次的旋转操作(需要两次插入操作)。插入和删除操作的总时间复杂度为 O(logn)。
旋转是红黑树调整的核心操作,包含左旋转和右旋转两种,均能保持二叉排序树特性。
旋转前:
A(B)
/ \
X(B) B(B)
/ \
Y(B) Z(B)
旋转后:
B(B)
/ \
A(B) Z(B)
/ \
X(B) Y(B)
旋转前:
B(B)
/ \
A(B) Z(B)
/ \
X(B) Y(B)
旋转后:
A(B)
/ \
X(B) B(B)
/ \
Y(B) Z(B)
左旋 ←→ 右旋(逆操作):
A(B) B(B) A(B)
/ \ / \ / \
X(B) B(B) A(B) Z(B) X(B) B(B)
/ \ / \ / \
Y(B) Z(B) Y(B) Y(B) Z(B)
红黑树的插入操作基于二叉排序树插入规则,插入后需通过调整恢复红黑树特性,步骤如下:
插入前:
10(R)
/ \
NIL(B) NIL(B)
插入后:
10(R)
/ \
NIL(B) 11(R)
/ \
NIL(B) NIL(B)
调整目标:插入后仅可能破坏特性4(出现连续红色结点),需通过着色和旋转恢复。
调整场景及处理方法:
示例流程:插入结点6后,依次触发情形1、情形2、情形3调整,最终恢复红黑树特性。
12(B)
/ \
4(R) 16(B)
/ \ / \
2(B) 8(B) NIL(B) 20(R)
/ \ / \ / \
NIL NIL 5(R) 11(R) NIL NIL
/ \ / \
NIL NIL NIL NIL
12(B)
/ \
4(R) 16(B)
/ \ / \
2(B) 8(B) NIL(B) 20(R)
/ \ / \ / \
NIL(B) NIL(B) 5(R) 11(R) NIL(B) NIL(B)
/ \
NIL(B) 6(R)
/ \
NIL(B) NIL(B)
12(B)
/ \
4(R) 16(B)
/ \ / \
2(B) 8(R) NIL(B) 20(R)
/ \ / \ / \
NIL(B) NIL(B) 5(B) 11(B) NIL(B) NIL(B)
/ \
NIL(B) 6(R)
/ \
NIL(B) NIL(B)
12(B)
/ \
8(R) 16(B)
/ \ / \
4(B) 11(B) NIL(B) 20(R)
/ \ / \
2(B) 5(B) NIL(B) NIL(B)
/ \
NIL(B) 6(R)
/ \
NIL(B) NIL(B)
8(B)
/ \
4(R) 12(R)
/ \ / \
2(B) 5(B) NIL(B) 16(B)
/ \ / \
NIL(B) 6(R) NIL(B) 20(R)
/ \ / \
NIL(B) NIL(B) NIL(B) NIL(B)
红黑树的删除操作基于二叉排序树删除规则,删除后需通过调整恢复红黑树特性,核心逻辑如下:
示例流程:分别展示4种情形的涂色、旋转调整过程,最终恢复红黑树特性。
调整前:
12(B)
/ \
x(B+B) 9(B)
/ \ / \
NIL(B) NIL(B) NIL(B) NIL(B)
调整后:
12(B) (新x,涂为黑色)
/ \
x(B) 9(R)
/ \ / \
NIL(B) NIL(B) NIL(B) NIL(B)
调整前:
16(B)
/ \
x(B+B) 20(R)
/ \ / \
NIL(B) NIL(B) NIL(B) 18(B)
/ \
NIL(B) NIL(B)
16(R)
/ \
x(B+B) 20(B)
/ \ / \
NIL(B) NIL(B) NIL(B) 18(B)
/ \
NIL(B) NIL(B)
20(B)
/ \
16(R) 18(B)
/ \ / \
x(B+B) NIL(B) NIL(B) NIL(B)
/ \
NIL(B) NIL(B)
调整前:
父(B)
/ \
x(B+B) 20(B)
/ \ / \
NIL(B) NIL(B)红孩子(R) NIL(B)
/ \
NIL(B) NIL(B)
父(B)
/ \
x(B+B) 20(R)
/ \ / \
NIL(B) NIL(B)红孩子(B) NIL(B)
/ \
NIL(B) NIL(B)
父(B)
/ \
x(B+B) 红孩子(B)
/ \ / \
NIL(B) NIL(B) NIL(B) 20(R)
/ \
NIL(B) NIL(B)
调整前:
父(B)
/ \
x(B+B) 16(B)
/ \ / \
NIL(B) NIL(B) NIL(B) 20(R)
/ \
NIL(B) NIL(B)
父(B)
/ \
x(B+B) 16(B) (继承父颜色)
/ \ / \
NIL(B) NIL(B) NIL(B) 20(B)
/ \
NIL(B) NIL(B)
16(B)
/ \
父(B) 20(B)
/ \ / \
x(B) NIL(B) NIL(B) NIL(B)
/ \
NIL(B) NIL(B)
选项:
A. 红黑树的红结点的数目最多和黑结点的数目相同
B. 若红黑树的所有结点都是黑色的,则它一定是一棵满二叉树
C. 红黑树的任何一个分支结点都有两个非空孩子结点
D. 红黑树的子树也一定是红黑树
解析:
A:✔ 正确
红黑树中不存在两个连续的红结点,且根结点为黑色,因此红结点最多与黑结点数目相同。
B:✘ 错误
即使所有结点均为黑色,只要从根到各叶子路径上的黑结点数相同即可,并不要求是满二叉树。
C:✘ 错误
红黑树允许存在 NIL 叶子结点(空结点,视为黑),因此内部结点不一定有两个非空孩子。
D:✘ 错误
子树的根结点可能是红色,且从该子树根到叶子的黑结点数未必满足红黑树的定义。
正确答案:A
注:黑色结点为 实心,红色结点为 空心
A:
●
/
○
(路径黑结点数不一致)
B:
○
/ \
● ●
(根结点为红色,违反性质)
C:
●
/
○
/
○
(存在连续红结点)
D:
●
/ \
○ ○
/ \
● ●
解析:
红黑树需满足:
正确答案:D
解析:
按照红黑树插入规则:
最终形成近似完全平衡结构:
●4
/ \
○2 ○6
/ \ / \
●1 ●3 ●5 ●7
红结点为:2、6 的孩子结点在调整后,最终红结点为 2、4、6 → 共 3 个
正确答案:3
●3
/ \
○2 ○4
/ \
●1 ●5
●5
/
○3
●5
/
○3
/
○2
分析:
此时属于 “父红、叔黑、左左型”,修复步骤为:
题目问的是:下一步操作
正确答案:(变色)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。