平衡树全家桶 2

笛卡尔树

仅支持静态,不支持动态

image-20260707112858766

建树过程:单调栈。对于每个新加入的点 xx

  • 最后pop掉的点 yy,则 yyxx 左子树
  • 最后pop不走的点 zz,则 xxzz 右子树

用于静态区间最大值之类的维护

Size Balanced Tree

树的性质:叔叔比侄子大,即:

1
2
3
4
size(N.left) >= size(N.right.left)
size(N.left) >= size(N.right.right)
size(N.right) >= size(N.left.left)
size(N.right) >= size(N.left.right)

平衡维护:

  • 右左过大:转两次它

    image-20260707112522670

  • 右右过大:转一次右

    image-20260707112604881

  • 左右过大:转两次它

  • 左左过大:转一次左

AVL

保证左右子树高度差严格小于1

动画:AVL Tree Visualzation

感觉旋转的那些东西还是大同小异。反正就是Rotate,已经不想写了

红黑树

红黑树有如下性质:

  • 每个点要么红色、要么黑色
  • 根到任何一个叶子节点经过的黑色点的数量相同
  • 没有任何相邻的红色节点
  • 根节点为黑色

我们考虑插入一个点,就先让它是红色,然后向上维护,保证没有出现连续的红色。而每次Rotate过程中也保证黑色之和不变

  • Flip:祖父的左右都是红色

    image-20260707114829823

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

    image-20260707115015468

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

    image-20260707115050175

左偏红黑树

在红黑树的基础上,保证只有左子树能是红色,右边必须是黑色

其主要优势是,分类讨论的情况很少,很适合手搓

这篇文章讲的不错:2-3树与红黑树 - riteme.site

  • 常规flip:

    image-20260707115410336

  • 连续左红:

    image-20260707115451010

  • 碰到右红节点:

    image-20260707115332445

AA树

变成了右边可以是红色,左边必须是黑色

好像里面操作可能有一些不一样,但大同小异,不深究了