植树节刚过,大班植树活动也在今天结束了qwq…于是再来种几棵树玩玩吧
话说平衡树敲起来是真的爽
平衡树总结Ⅰ:概况
概述
二叉树大家肯定都很熟悉,它常见的操作有插入、删除、查找第k大、查询名次、查询前驱后继等等。但是普通的二叉搜索树在绝大多数情况(非随机数据)的表现非常糟糕,其深度没有“保障”,最坏情况下深度是 O ( N ) O(N) O(N) 的,那么每次操作也是 O ( N ) O(N) O(N) 的。这显然是不ok的。
平衡树是二叉树的改进,它能通过某种方式控制深度,实现自平衡,使得其深度总是维持在 O ( log N ) O(\log N) O(logN) 左右(替罪羊树稍有些不同)因此能在 O ( log N ) O(\log N) O(logN) 内甚至更快地进行插入、删除、查找第k大、查询名次、查询前驱后继等操作。
类别
常见的平衡树有 AVLTree、Splay、Treap、B(+)Tree、RBTree、SBTree、替罪羊树:
- AVLTree:追求极致完美,任何两子树的高度差 ≤ 1 \le 1 ≤1,增删时调整,树高总是严格保持在 O ( log N ) O(\log N) O(logN)
- Splay:通过巧妙设计的四种旋转来调整树高,增删查都伴随调整,使树高保持在 O ( log N ) O(\log N) O(logN)
- Treap:通过随机权值强行模拟随机数据插入的二叉树,增删时调整,使树高期望保持在 O ( log N ) O(\log N) O(logN)
- B(+)Tree:和其他平衡树不同,它是多叉树,并且利用索引实现高效的查找。其树高能保持在常数更小的 O ( log N ) O(\log N) O(logN)
- RBTree:emm…及其复杂精密的平衡树,增删时调整,有一套复杂的规则使树高保持在常数较小的 O ( log N ) O(\log N) O(logN)
- SBTree:通过子树size域的差距表现来进行旋转维护,增时调整,使树高保持在 O ( log N ) O(\log N) O(logN)
- 替罪羊树:暴力美学,必要时直接拍平子树,然后从中间给拎起来重建二叉树,树高可“均摊”地保持在 O ( log N ) O(\log N) O(logN)
后文链接