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

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


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

左旋
左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
对p进行左旋右旋(是一个动作),动图,左旋往左走(after),右旋往右走(before)



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

- 这里老师的gif更好
右旋
右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变

红黑树的查找
与二叉树查找一样,因为也是小的放左边,大的放右边
.
插入
- 新节点必须是红色的
- 显而易见的, 之前的性质5是能够保证的, 而现在的话, 如果是黑色的, 那么性质5必破坏
- 插入红色不过可能会破坏性质4, 不能有两个红色节点相连, 需要处理
- 也就是说插入黑色节点一定会破坏红黑树的性质,但是插入红色只是有可能会破坏
在插入节点后,只要包含插入节点的子树是符合红黑树的,那么加上父节点的树也是红黑树
插入的情景
-

情景二

-

-

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

-

LL双红
-

LR双红
-

-

插入总结
4种大的情形, 进行操作
-
空树: 直接插入, 作为黑色节点
-
插入的key已经存在, 替换就ok
-
插入节点父亲是黑色的: 直接红色插入
-
插入节点父亲是红色 (红红情况出现)
-
叔叔是红
- 父亲和叔叔改黑, 爷爷改红, 问题递归抛出, 看是否有红红情况, 没有则已经平衡
-
叔叔是黑, 或者没有叔叔
-
LL双红: 父亲改为黑, 爷爷改红, 爷爷右旋 (LL意为, 父是爷的左, 子是父的左) (改色, 旋转)
-
LR双红: 父亲左旋, 则变为LL双红形式, 交给LL双红处理 (旋转)
-
RR双红: 父亲改为黑, 爷爷改红, 爷爷左旋 (改色旋转)
-
RL双红: 父亲右旋, 则变为RR双红形式, 交给RR双红处理 (旋转)
-
-
可以看到, 最终终结的地方有, LL双红, RR双红
搭配上面的笔记食用哦
综合题:

删除总结
-
删除的难度比插入多一大截
-
好像也没必要看吧, 直接将逻辑删除就可以了把, 没必要这么麻烦

浙公网安备 33010602011771号