红黑树

134 阅读2分钟

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 镜像过来,恰好相反)