Treap树模板 hdu-4585

本文详细介绍了Treap树,包括其唯一性、平衡问题、数据结构和插入操作。Treap树是一种结合二叉搜索树和堆特性的数据结构,通过随机赋值优先级来保持近似平衡。文章还探讨了如何在Treap树中寻找第k大的数和查询某个数的排名,并提供了HDU 4585题目的AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

例题:hdu 4585

Treap树

1、Treap树的唯一性

2、Treap树的平衡问题

3、Treap树的数据结构

4、Treap树的插入

5、插入过程中维护堆的过程中用到的旋转

6、寻找第k大的数 O(logn)

7、查询某个数的名次 O(logn)

8、hdu 4585 AC代码


例题:hdu 4585

 

Treap树

是一种简单的平衡二叉搜索树。

二叉搜索树的每一个节点都有一个键值,除此之外Treap树为每个节点人为添加了一个称之为优先级的权值。对于键值来说,这是一棵二叉搜索树,对于权值来说这是一个堆。

1、Treap树的唯一性

Treap树的重要特性:另每个节点的优先级互不相等,那么整棵树的形态时唯一的,和元素的插入顺序没有关系。

2、Treap树的平衡问题

树的形态依赖于节点的优先级,那么如何配置每个节点的优先级,才能避免二叉树的形态退化成链表?最简单的方法时把每个节点的优先级进行随机赋值,那么生成的Treap树形态也是随机的。这虽然不能保证每次生成的Treap树一定时平衡的,但是期望的插入、删除、查找的复杂度都是O(logn)的。

3、Treap树的数据结构

struct Node{
    int size;  // 以这个点为根的子树的节点的数量
    int rank;  // 优先级
    int key;  // 键值
    Node *son[2];  //son[0]时左儿子,son[1]是右儿子
    bool operator < (const Node &a)const {return rank < a.rank;}
    int cmp(int x)const{
        if(x == key) return -1;
        return x < key? 0 : 1;
    }
    void update(){  //更新size
        size = 1;
        if(son[0] != NULL) size += son[0] -> size;
        if(son[1] != NULL) size += son[1] -> size;
    }
};

4、Treap树的插入

每读入一个新的节点,为它分配一个随机的优先级,插入到树中,在插入时动态调整树的结构,使它仍然是一棵Treap树。

把新节点插入到Treap树的过程有两步

(1)用朴素的插入方法把node按键值的大小插入到合适的子树上去。

(2)给node随机分配一个优先级,如果node的优先级违反了堆的性质,即它的优先级比父节点高,那么让node往上走,替代父节点,最后得到一个新的Treap树。

void insert(Node * &o, int x){  //插入
    if(o == NULL){
        o 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值