Skip to content

红黑树 ​

红黑树 vs AVL树 ​

AVL是严格的平衡二叉树,无论是执行插入还是删除只要不满足要求都会进行旋转,而旋转时非常耗时的,所以AVL树更适合插入和删除比较少但查找多的情况。红黑树是一种弱平衡二叉树,他的旋转次数较AVL少许多,因此应用场景也相对广一些。

性质 ​

  1. 每个结点都是红色的或是黑色的
  2. 根结点是黑色的
  3. 每个叶结点是黑色的
  4. 如果一个结点是红色的,则它的两个子结点都是黑色的
  5. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色节点

插入 ​

  1. 如果父结点为黑色结点,那么插入的红色结点不会影响平衡,跳过。
  2. 如果父结点为红色结点
    1. 如果叔结点为红色结点
      1. 父结点和叔结点变为黑色,祖父结点如果不是根结点则变红色
      2. 向上递归,继续平衡祖父结点
    2. 如果叔结点不存在或是黑色结点
      1. 先进行旋转(同 AVL 树4种旋转方式)
      2. 父结点和祖父节点换颜色
      3. 向上递归,继续平衡祖父结点

删除 ​

  1. 找到替换结点:左子树的最大值结点 or 右子树的最小值结点(类似于二叉查找树的删除结点)
  2. 情景1:如果替换结点是红色,那么直接将替换节点值赋给删除结点,并删除替换结点。
  3. 如果替换结点是黑色:
    1. 情景2:如果替换结点是其父结点的左结点
      1. 情景2.1:如果替换结点的兄弟结点是红色,删除黑结点会导致左侧黑色结点少一,此时通过交换兄弟结点和父结点颜色并向左旋转解决。(类似于右右的结点情况)img
      2. 情景2.2:如果替换结点的兄弟结点是黑色,兄弟结点右结点为红色,左结点为任意颜色,此时不能通过情景2.1那样左旋达到平衡,而是需要将红色右子结点”借“过来。兄弟结点和父结点颜色对调,右子结点变为黑色,并进行左旋。img
      3. 情景2.3:兄弟结点右结点为黑色,左结点为红色。此时左结点与兄弟结点交换颜色,并右旋。再进行情景2.2img
      4. 情景2.4:兄弟结点子结点均为黑色。此时兄弟结点没有结点可以借了,只能向父结点借,把兄弟结点设为红色,将父结点作为新的替代结点,自底向上处理。 img
    2. 情景3:如果替换结点是其父结点的右结点,与左节点情况镜像

参考 ​