本文是根据郭家宝的文章《Treap的原理及实现》写的。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node{
struct node *left,*right;
int data,fix,size,weight;
node(int x){
data=x;
weight=size=;
fix=rand();
left=right=NULL;
}
void updata_size(){
size=weight+lsize()+rsize();
}
int lsize(){return left?left->size:;}
int rsize(){return right?right->size:;}
};
void right_rotate(node* &p){//右旋
node* t=p->left;
p->left=t->right;
t->right=p;
p->updata_size();
t->updata_size();
p=t;
}
void left_rotate(node* &p){//×óÐý
node* t=p->right;
p->right=t->left;
t->left=p;
p->updata_size();
t->updata_size();
p=t;
}
void insert(node* &p,int x){//左旋
if(p&&p->data==x){
p->weight++;
p->size++;
return ;
}
if(!p){
p=new node(x);
}else if(x<p->data){
insert(p->left,x);
if(p->left->fix<p->fix)
right_rotate(p);
}else{
insert(p->right,x);
if(p->right->fix<p->fix)
left_rotate(p);
}
p->updata_size();
}
int find(node* p,int x){//查找
if(!p) return ;
if(p->data==x) return ;
if(p->data>x)
return find(p->left,x);
else
return find(p->right,x);
}
void Delete(node* &p,int x){//删除
if(p->data==x){
if(--p->weight==){
if(!p->left||!p->right){
node* t=p;
if(!p->right)
p=p->right;
else
p=p->left;
delete p;
}else{
if(p->left->fix<p->right->fix){
right_rotate(p);
Delete(p->right,x);
}else{
left_rotate(p);
Delete(p->left,x);
}
}
}
}else if(p->data>x){
Delete(p->left,x);
}else{
Delete(p->right,x);
}
if(p) p->updata_size();
}
void mid_print(node* p){//中序
if(p){
mid_print(p->left);
printf("%d ",p->data);
mid_print(p->right);
}
}
node* Pre(node* p,int x,node* opt){//前缀
if(!p) return opt;
if(p->data<=x) return Pre(p->right,x,p);
else return Pre(p->left,x,opt);
}
node* Suf(node* p,int x,node* opt){//后继
if(!p) return opt;
if(p->data>=x) return Suf(p->left,x,p);
else return Suf(p->right,x,opt);
}
node* Kth(node* p,int k){//Kth
if(k<=p->lsize()) return Kth(p->left,k);
else if(k>p->lsize()+p->weight) return Kth(p->right,k-(p->lsize()+p->weight));
else return p;
}
int rand(node* p,int x,int cur){//排名
if(x==p->data) return cur+p->lsize()+;
else if(x<p->data) return rand(p->left,x,cur);
else return rand(p->right,x,cur+p->lsize()+p->weight);
}
int main(){
node* root;
case :insert(root,x);
case :if(find(root,x))Delete(root,x);
case :mid_print(root);
case :printf("%d\n",Pre(root,x,)->data);
case :printf("%d\n",Suf(root,x,)->data);
case :printf("%d\n",Kth(root,k)->data);
case :printf("%d\n",rank(root,x));
return ;
}

Treap(树堆):随机平衡二叉树实现的更多相关文章

  1. BZOJ3224/LOJ104 普通平衡树 treap(树堆)

    您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...

  2. 可旋转Treap(树堆)总结

    树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树.其基本操作的期望时间复杂度为O(logn).相对于其他的平衡二叉搜索树,Trea ...

  3. treap(树堆)

    一棵treap是一棵修改了结点顺序的二叉查找树,如图,显示一个例子,通常树内的每个结点x都有一个关键字值key[x],另外,还要为结点分配priority[x],它是一个独立选取的随机数. 假设所有的 ...

  4. 查找——图文翔解Treap(树堆)

    之前我们讲到二叉搜索树,从二叉搜索树到2-3树到红黑树到B-树. 二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会非常大,Treap树就是一种解决二叉搜索树可能深度过大的还有一种数据结构. T ...

  5. 树堆(Treap)学习笔记 2020.8.12

    如果一棵二叉排序树的节点插入的顺序是随机的,那么这样建立的二叉排序树在大多数情况下是平衡的,可以证明,其高度期望值为 \(O( \log_2 n )\).即使存在一些极端情况,但是这种情况发生的概率很 ...

  6. *衡树 Treap(树堆) 学习笔记

    调了好几个月的 Treap 今天终于调通了,特意写篇博客来纪念一下. 0. Treap 的含义及用途 在算法竞赛中很多题目要使用二叉搜索树维护信息.然而毒瘤数据可能让二叉搜索树退化成链,这时就需要让二 ...

  7. Treap树 笔记

    预备知识:二叉查找树.堆(heap).平衡二叉树(AVL)的基本操作(左旋右旋) 定义: Treap.平衡二叉树.Tree+Heap.树堆. 每个结点两个键值(key.priority). 性质1. ...

  8. 真·浅谈treap树

    treap树是一种平衡树,它有平衡树的性质,满足堆的性质,是二叉搜索树,但是我们需要维护他 为什么满足堆的性质?因为每个节点还有一个随机权值,按照随机权值维持这个堆(树),可以用O(logn)的复杂度 ...

  9. Treap树的基础知识

    原文 其它较好的的介绍:堆排序  AVL树 树堆,在数据结构中也称Treap(事实上在国内OI界常称为Traep,与之同理的还有"Tarjan神犇发明的"Spaly),是指有一个随 ...

  10. Treap树

    Treap树算是一种简单的优化策略,这名字大家也能猜到,树和堆的合体,其实原理比较简单,在树中维护一个"优先级“,”优先级“ 采用随机数的方法,但是”优先级“必须满足根堆的性质,当然是“大根 ...

随机推荐

  1. javascript数组浅谈1

    最近心血来潮要开始玩博客了,刚好也在看数组这块内容,第一篇就只好拿数组开刀了,自己总结的,有什么不对的地方还请批评指正,还有什么没写到的方面也可以提出来我进行完善,谢谢~~ 首先,大概说说数组的基本用 ...

  2. mysql常见的运算符及使用

    mysql中有4类运算符,它们是: 算术运算符 比较运算符 逻辑运算符 位操作运算符 算术操作符 算术操作符是SQL中最基本的操作运算符,主要有一下几种运算符: +(加). -(减). *(乘). / ...

  3. Microsoft Dynamics CRM 2013 --针对特定实体,取消保存功能(包含自动保存)

    AutoSave 是 Microsoft Dynamics CRM 2013 一个新特性. 但AutoSave的有效范围是[所有实体],不允许针对特定某一实体进行设置. 所以,若想针对特定实体进行设置 ...

  4. Android 去掉标题和状态栏 达到全屏显示

    1,正常显示的标题和状态栏的截图. 2,具体代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCrea ...

  5. 在 SharePoint Server 2013 中配置建议和使用率事件类型

    http://technet.microsoft.com/zh-cn/library/jj715889.aspx 适用于: SharePoint Server 2013 利用使用事件,您可以跟踪用户与 ...

  6. R语言学习笔记:向量

    向量是R语言最基本的数据类型. 单个数值(标量)其实没有单独的数据类型,它只不过是只有一个元素的向量. x <- c(1, 2, 4, 9) x <- c(x[1:3], 88, x[4] ...

  7. Linux环境变量

    本文地址:http://www.cnblogs.com/archimedes/p/linux-envionment-variables.html,转载请注明源地址. 1.什么是环境变量 bash sh ...

  8. 【读书笔记】iOS-NSDate

    +dateWithTimeIntervalSinceNow:接受一个NSTimeInterval参数,该参数是一个双精度值,表示以秒为单位的时间间隔.通过该参数可以指定时间偏移的方式:对于将来的时间, ...

  9. 【原】log4cplus使用说明

    网上关于开源日志工具log4cplus的说明有很多,但大多略显复杂,本文主要从实用的角度,介绍一种最简单而且又实用的方法.本文的方法已经足够满足实际工程中的使用需求,而且不需要很复杂的流程,可以实现. ...

  10. UnityShader之固定管线Fixed Function Shader【Shader资料3】

    Fixed function shader简介:  属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的情况.使用的是ShaderLab语言,语法与微软的FX files 或 ...