平衡树全家桶 2
平衡树全家桶 2
笛卡尔树
仅支持静态,不支持动态

建树过程:单调栈。对于每个新加入的点
- 最后pop掉的点 ,则 是 左子树
- 最后pop不走的点 ,则 是 右子树
用于静态区间最大值之类的维护
Size Balanced Tree
树的性质:叔叔比侄子大,即:
1 | size(N.left) >= size(N.right.left) |
平衡维护:
-
右左过大:转两次它

-
右右过大:转一次右

-
左右过大:转两次它
-
左左过大:转一次左
AVL
保证左右子树高度差严格小于1
感觉旋转的那些东西还是大同小异。反正就是Rotate,已经不想写了
红黑树
红黑树有如下性质:
- 每个点要么红色、要么黑色
- 根到任何一个叶子节点经过的黑色点的数量相同
- 没有任何相邻的红色节点
- 根节点为黑色
我们考虑插入一个点,就先让它是红色,然后向上维护,保证没有出现连续的红色。而每次Rotate过程中也保证黑色之和不变
-
Flip:祖父的左右都是红色

-
祖父的另一边是黑色,但这边是顺着

-
如果这边是反的:我们可以先Rotate,转为上一种情况

左偏红黑树
在红黑树的基础上,保证只有左子树能是红色,右边必须是黑色
其主要优势是,分类讨论的情况很少,很适合手搓
这篇文章讲的不错:2-3树与红黑树 - riteme.site
-
常规flip:

-
连续左红:

-
碰到右红节点:

AA树
变成了右边可以是红色,左边必须是黑色
好像里面操作可能有一些不一样,但大同小异,不深究了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 zhangxixi的博客!




