Treap(树堆):随机平衡二叉树实现
本文是根据郭家宝的文章《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(树堆):随机平衡二叉树实现的更多相关文章
- BZOJ3224/LOJ104 普通平衡树 treap(树堆)
您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...
- 可旋转Treap(树堆)总结
树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树.其基本操作的期望时间复杂度为O(logn).相对于其他的平衡二叉搜索树,Trea ...
- treap(树堆)
一棵treap是一棵修改了结点顺序的二叉查找树,如图,显示一个例子,通常树内的每个结点x都有一个关键字值key[x],另外,还要为结点分配priority[x],它是一个独立选取的随机数. 假设所有的 ...
- 查找——图文翔解Treap(树堆)
之前我们讲到二叉搜索树,从二叉搜索树到2-3树到红黑树到B-树. 二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会非常大,Treap树就是一种解决二叉搜索树可能深度过大的还有一种数据结构. T ...
- 树堆(Treap)学习笔记 2020.8.12
如果一棵二叉排序树的节点插入的顺序是随机的,那么这样建立的二叉排序树在大多数情况下是平衡的,可以证明,其高度期望值为 \(O( \log_2 n )\).即使存在一些极端情况,但是这种情况发生的概率很 ...
- *衡树 Treap(树堆) 学习笔记
调了好几个月的 Treap 今天终于调通了,特意写篇博客来纪念一下. 0. Treap 的含义及用途 在算法竞赛中很多题目要使用二叉搜索树维护信息.然而毒瘤数据可能让二叉搜索树退化成链,这时就需要让二 ...
- Treap树 笔记
预备知识:二叉查找树.堆(heap).平衡二叉树(AVL)的基本操作(左旋右旋) 定义: Treap.平衡二叉树.Tree+Heap.树堆. 每个结点两个键值(key.priority). 性质1. ...
- 真·浅谈treap树
treap树是一种平衡树,它有平衡树的性质,满足堆的性质,是二叉搜索树,但是我们需要维护他 为什么满足堆的性质?因为每个节点还有一个随机权值,按照随机权值维持这个堆(树),可以用O(logn)的复杂度 ...
- Treap树的基础知识
原文 其它较好的的介绍:堆排序 AVL树 树堆,在数据结构中也称Treap(事实上在国内OI界常称为Traep,与之同理的还有"Tarjan神犇发明的"Spaly),是指有一个随 ...
- Treap树
Treap树算是一种简单的优化策略,这名字大家也能猜到,树和堆的合体,其实原理比较简单,在树中维护一个"优先级“,”优先级“ 采用随机数的方法,但是”优先级“必须满足根堆的性质,当然是“大根 ...
随机推荐
- PHP学习笔记:keditor的使用
keditor时一个免费的开源编辑器,很多公司在使用(百度编辑器也不错).最近为了做一个客户信息管理系统,在发送邮件模块用到这个编辑器,也算学习一下新的东西. 第一步:下载编辑器 到它的官网下载:ht ...
- HttpController的激活
Web API调用请求的目标是定义在某个HttpController类型中的某个Action方法,所以消息处理管道的最终需要激活目标HttpController对象.调用请求的URI会携带目标Http ...
- Android应用开发基础之四:网络编程(一)
网络图片查看器 确定图片的网址 发送http请求 URL url = new URL(address); //获取连接对象,并没有建立连接 HttpURLConnection conn = (Http ...
- ServiceLocator是反模式
关于ServiceLocator模式 http://www.cnblogs.com/hwade/archive/2011/01/30/CommonServiceLocator.html 为什么是Ant ...
- mvc项目架构搭建之UI层的搭建
项目架构搭建之UI层的搭建 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构各部分解析 5.项目创 ...
- Force.com微信开发系列(一) 后台配置
为寻找国内免费云资源作为微信后台,花了一天时间试用SinaAppEngine(SAE),调试太不方便用户体验差.新浪作为媒体公司技术功底经不起考验,亚马逊能推出AWS,新浪还不行!更好选项是百度Bai ...
- iOS 新窗口在最上层
有的时候需要弹出一个UIView 在整个视图的最上方,使用 [self.view addsubview : view] 一般就可以了,但是这样不严谨,因为这是一个tableview,那么这个view ...
- iOS之Cookie
iOS之Cookie使用 简介 概念:Cookie中文名称叫做"小型文本文件",指某些网站为了辨别用户身份而存储在用户本地终端上的数据(通常经过加 密). Web服务器可以用过Se ...
- sublime text 3 如何安装 package control
sublime text3 是个很好的编辑工具,前端程序员觉得她很好,我是在一次视频中看到她能帮助自动完成很多快捷的操作. 为什么安装? 如果想要给sublime text 中安装别的插件(这里称呼为 ...
- C#照片批量压缩小工具
做了一个照片批量压缩工具,其实核心代码几分钟就完成了,但整个小工具做下来还是花了一天的时间.中间遇到了大堆问题,并寻求最好的解决方案予以解决.现在就分享一下这个看似简单的小工具所使用的技术. 软件界面 ...