红黑树

性质

  1. 根节点与每个叶子节点都是黑色
  2. 每个红色节点的两个子节点一定是黑色
  3. 任意节点到每个叶子的路径包含相同数量的黑色节点,因此如果一个节点存在黑色子节点,那么该节点肯定有两个子节点
  4. 因此,红黑树是黑色节点完美平衡的二叉查找树

左旋/右旋

把子树的左/右节点旋转到父节点位置上,即原本的父节点变为左/右节点的子节点,底下的节点也会跟着旋转。
左旋伪代码

// 原本x为y的父节点
// r 右节点,l 左节点,f 父节点
y = x.r
x.r = y.l
if(y.r非空)
    y.r.f = x
y.f = x.f

if(x.f非空){
    根节点 = y
} else { // 判断y的左右
    if(x.f.l == x)
        x.f.l = y
    else
        x.f.r = y
}
y.l = x
x.p = f


插入节点

  1. 找到插入的位置,算法就是普通的查找算法
  2. 在插入后调整主结构,进行自平衡处理

删除节点

  1. 若删除的节点没有子节点,就无需替代节点
  2. 若删除节点只有一个子节点,用子节点替代删除节点
  3. 若删除节点有两个子节点,用后继节点(大于被删除节点的最小节点,即右子树的最左节点)替代删除节点

参考文献

posted @ 2021-02-28 21:13  一语子  阅读(74)  评论(0)    收藏  举报