AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

平衡树 Treap -- STL set

作者: 作者的头像   zhengyh ,  2020-07-26 21:51:06 ,  所有人可见 ,  阅读 1667


4


3

平衡树的分类

  • treap (BST + heap(大根堆))
  • 红黑树
  • splay
  • sbt
  • AVL

BST(二叉搜索树)

  1. 定义
  2. 性质
  3. BST的中序遍历一定是一个递增序列, 一个树的中序遍历就是将一颗树的各个节点投影到叶子节点的水平面上的序列.
  4. 任何随机一棵BST的期望(平均)高度为logn, 这里我们用大根堆的随机权值来达到随机的目的.
  5. 应用场景
    动态维护一个有序序列.

Treap

定义: 中序遍历满足严格递增且满足大根堆的树.

  1. Treap和BST的基本操作

    • 插入
    • 删除
    • 前驱,后继: I. 前驱: 一直沿着当前节点的左子树的右儿子走(最大值)直到某个点没有右儿子, 则该点为前驱, II. 后继: 一直沿着当前节点的左子树的左儿子走直到某个点没有左儿子, 则该点为后继(最小值)
    • 求某个数的在平衡树中的序号
    • 求序号为k的数
    • 求比某个值大的最小节点的值(这个值不一定在平衡树里面)
    • 求比某个值小的最大节点的值
  2. 节点信息

struct node
{
    int l, r; // 左右节点的编号
    int key, value; // BST和heap的关键字 也就是说**treap的节点受到了两个数据结构特性的限制**
}trp;
  1. 空间复杂度 $O(n)$
    对于线段树来说, 一个点是对应多个数, 所以空间复杂度为$O(4n)$的, 但是平衡树是每个点对应一个数, 所以空间复杂度就为$O(n)$.

  2. 操作详解

  3. 插入

    左(zag)右(zig)旋 -> 不影响中序遍历
    用途: 就是交换儿子节点与父节点

  4. 删除

    不断左/右旋, 直到旋转到叶子节点, 直接擦除即可.

  5. 时间复杂度: $O(logn)$

例题讲解及treap模板

1 评论


用户头像
empty_1   2020-10-01 22:30         踩      回复

优秀


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息