红黑树

为什么要学红黑树

红黑树的起源,自然是二叉查找树了,这种树结构从根节点开始,左子节点小于它,右子节点大于它。每个节点都符合这个特性,所以易于查找,是一种很好的数据结构。但是它有一个问题,就是容易偏向某一侧,这样就像一个链表结构了,失去了树结构的优点,查找时间会变坏。红黑树就是一种平衡树,它可以保证二叉树基本符合矮矮胖胖的结构,但是理解红黑树之前,必须先了解另一种树,叫2-3树,红黑树背后的逻辑就是它。

性质

红黑树必须要满足这些性质

image-20210723213354721

其中性质五可以圈出一个子树来验证:例如F到它子树的所有叶子节点都为2个黑节点

image-20210723213838414

image-20210723213958418

2-3树

  • 看了笔记中的2,3树
  • 整体的插入逻辑就是, 如果能插就插, 插不了就往上抛出
  • 有点像是b树, 它往上分裂的这样一个逻辑
  • 是的, 2-3树是b树的特例,b树就是定义每个节点里面的元素最多不超过多少个,超过就会分裂出父节点
  • image-20211124105439203

左旋

左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。

对p进行左旋右旋(是一个动作),动图,左旋往左走(after),右旋往右走(before)

8fd7501427abb6cb0497a2ad7018f9db

image-20210723214523828

image-20210723214512390

  • 这样理解会好一些, 将新旋转点的左子树移到旧旋转点的右子树位置, 反向新旧的连接, 新替换旧的位置

image-20210723214541377

  • 这里老师的gif更好

右旋

右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变

image-20210723215315962

红黑树的查找

与二叉树查找一样,因为也是小的放左边,大的放右边

.image-20211124100647690

插入

  • 新节点必须是红色的
    • 显而易见的, 之前的性质5是能够保证的, 而现在的话, 如果是黑色的, 那么性质5必破坏
  • 插入红色不过可能会破坏性质4, 不能有两个红色节点相连, 需要处理
  • 也就是说插入黑色节点一定会破坏红黑树的性质,但是插入红色只是有可能会破坏

在插入节点后,只要包含插入节点的子树是符合红黑树的,那么加上父节点的树也是红黑树

插入的情景

  • image-20210724151312271

    情景二

    image-20211124101252946

  • image-20210724151612623

  • image-20210724152347598

    然后当前节点变为爷爷了,爷爷是红色,你可以理解为是插入节点,接下来就会对爷爷的父节点,叔叔,爷爷的爷爷进行变色,由于根节点一定是黑色,那么变色到最后一定是可行的

  • image-20210724152412782

  • image-20210724152611437

    LL双红

  • image-20210724152813239

    LR双红

  • image-20210724152900633

  • image-20210724153229917

插入总结

4种大的情形, 进行操作

  • 空树: 直接插入, 作为黑色节点

  • 插入的key已经存在, 替换就ok

  • 插入节点父亲是黑色的: 直接红色插入

  • 插入节点父亲是红色 (红红情况出现)

    • 叔叔是

      • 父亲和叔叔改黑, 爷爷改红, 问题递归抛出, 看是否有红红情况, 没有则已经平衡
    • 叔叔是, 或者没有叔叔

      • LL双红: 父亲改为黑, 爷爷改红, 爷爷右旋 (LL意为, 父是爷的左, 子是父的左) (改色, 旋转)

      • LR双红: 父亲左旋, 则变为LL双红形式, 交给LL双红处理 (旋转)

      • RR双红: 父亲改为黑, 爷爷改红, 爷爷左旋 (改色旋转)

      • RL双红: 父亲右旋, 则变为RR双红形式, 交给RR双红处理 (旋转)

可以看到, 最终终结的地方有, LL双红, RR双红

搭配上面的笔记食用哦

综合题:

image-20211124104126469

删除总结

posted @ 2021-11-24 11:05  JJJmk  阅读(73)  评论(0)    收藏  举报