1.红黑树的特点
-
每个节点都有红色或黑色
-
树的根始终是黑色的 (黑土地孕育黑树根, )
-
没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点,并没有说不能出现连续的黑色节点)
-
从节点(包括根)到其任何后代NULL节点(叶子结点下方挂的两个空节点,并且认为他们是黑色的)的每条路径都具有相同数量的黑色节点
2.红黑树的调整
-
recolor (重新标记黑色或红色)
-
rotation (旋转,这是树达到平衡的关键)
-
先尝试 recolor,如果 recolor 不能达到红黑树的 4 点要求,然后我们尝试 rotation
1. 颜色变换
2.旋转-左旋-右旋
2.1左旋:根节点变为右子树的左节点
2.2右旋:根节点变为左子树的右节点
3.调整策略
3.1左左情况(LL)
当前节点是其父节点的左子节点,其父节点是其祖父节点的左节点
调整方法:右旋+替换根节点与其右子节点的颜色
3.2左右情况(LR)
当前节点是其父节点的右子树,其父节点是其祖父节点的左节点
调整方法:先左旋转化为左左情况
3.3右右情况(RR)
当前节点是其父节点的右节点,其父节点是其祖父节点的右节点
调整方法:左旋+替换根节点与其左子节点的颜色
3.4右左情况(RL)
当前节点是其父节点的左子树,其父节点是其祖父节点的右子树
调整方法:先右旋转化为右右情况
具体的调整公式:
-
将新插入的节点标记为红色
-
如果 X 是根结点(root),则标记为黑色
-
如果 X 的 parent 不是黑色,同时 X 也不是 root:
-
3.1 如果 X 的 uncle (叔叔) 是红色
-
3.1.1 将 parent 和 uncle 标记为黑色
-
3.1.2 将 grand parent (祖父) 标记为红色
-
3.1.3 让 X 节点的颜色与 X 祖父的颜色相同,然后重复步骤 2、3
-
4.具体的例子1
-
将新插入的节点标记为红色
-
如果 X 是根结点(root),则标记为黑色
-
如果 X 的 parent 不是黑色,同时 X 也不是 root:
-
如果 X 的 uncle (叔叔) 是黑色
-
左左 (P 是 G 的左孩子,并且 X 是 P 的左孩子)
-
左右 (P 是 G 的左孩子,并且 X 是 P 的右孩子)
-
右右 (和 3.2.1 镜像过来,恰好相反)
-
右左 (和 3.2.2 镜像过来,恰好相反)
-