Size Balance Tree(SBT模板整理)
/*
* tree[x].left 表示以 x 为节点的左儿子
* tree[x].right 表示以 x 为节点的右儿子
* tree[x].size 表示以 x 为根的节点的个数(大小)
*/
struct SBT
{
int key,left,right,size;
} tree[10010];
int root = 0,top = 0;
void left_rot(int &x) // 左旋
{
int y = tree[x].right;
if (!y) return;
tree[x].right = tree[y].left;
tree[y].left = x;
tree[y].size = tree[x].size;
tree[x].size = tree[tree[x].left].size + tree[tree[x].right].size + 1;
x = y;
}
void right_rot(int &x) //右旋
{
int y = tree[x].left;
if (!y) return;
tree[x].left = tree[y].right;
tree[y].right = x;
tree[y].size = tree[x].size;
tree[x].size = tree[tree[x].left].size + tree[tree[x].right].size + 1;
x = y;
}
void maintain(int &x,bool flag) //维护SBT状态
{
if (!x) return;
if (flag == false) //左边
{
if(tree[tree[tree[x].left].left].size > tree[tree[x].right].size)//左孩子的左孩子大于右孩子
right_rot(x);
else if (tree[tree[tree[x].left].right].size > tree[tree[x].right].size) //左孩子的右孩子大于右孩子
{
left_rot(tree[x].left);
right_rot(x);
}
else
return;
}
else //右边
{
if(tree[tree[tree[x].right].right].size > tree[tree[x].left].size)//右孩子的右孩子大于左孩子
left_rot(x);
else if(tree[tree[tree[x].right].left].size > tree[tree[x].left].size) //右孩子的左孩子大于左孩子
{
right_rot(tree[x].right);
left_rot(x);
}
else
return;
}
maintain(tree[x].left,false);
maintain(tree[x].right,true);
maintain(x,true);
maintain(x,false);
}
void insert(int &x,int key) //插入
{
if (x == 0)
{
x = ++top;
tree[x].left = 0;
tree[x].right = 0;
tree[x].size = 1;
tree[x].key = key;
}
else
{
tree[x].size++;
if(key < tree[x].key)
insert(tree[x].left,key);
else
insert(tree[x].right,key);//相同元素可插右子树
maintain(x,key >= tree[x].key);
}
}
int remove(int &x,int key) //利用后继删除
{
tree[x].size--;
if(key > tree[x].key)
remove(tree[x].right,key);
else if(key < tree[x].key)
remove(tree[x].left,key);
else if(tree[x].left !=0 && !tree[x].right) //有左子树,无右子树
{
int tmp = x;
x = tree[x].left;
return tmp;
}
else if(!tree[x].left && tree[x].right != 0) //有右子树,无左子树
{
int tmp = x;
x = tree[x].right;
return tmp;
}
else if(!tree[x].left && !tree[x].right) //无左右子树
{
int tmp = x;
x = 0;
return tmp;
}
else //左右子树都有
{
int tmp = tree[x].right;
while(tree[tmp].left)
tmp = tree[tmp].left;
tree[x].key = tree[temp].key;
remove(tree[x].right,tree[tmp].key);
}
}
int getmin(int x) //求最小值
{
while(tree[x].left)
x = tree[x].left;
return tree[x].key;
}
int getmax(int x) //求最大值
{
while(tree[x].right)
x = tree[x].right;
return tree[x].key;
}
int pred(int &x,int y,int key) //前驱,y初始前驱,从0开始, 最终要的是返回值的key值
{
if(x == 0)
return y;
if(key > tree[x].key)
return pred(tree[x].right,x,key);
else
return pred(tree[x].left,y,key);
}
int succ(int &x,int y,int key) //后继,同上
{
if(x == 0)
return y;
if(key < tree[x].key)
return succ(tree[x].left,x,key);
else
return succ(tree[x].right,y,key);
}
int select(int &x,int k) //查找第k小的数
{
int r = tree[tree[x].left].size + 1;
if(r == k)
return tree[x].key;
else if(r < k)
return select(tree[x].right,k - r);
else
return select(tree[x].left,k);
}
int rank(int &x,int key) //key排第几
{
if(key < tree[x].key)
{
return rank(tree[x].left,key);
}
else if(key > tree[x].key)
return rank(tree[x].right,key) + tree[tree[x].left].size + 1;
else
return tree[tree[x].left].size + 1;
}
int main()
{
//insert(root,key);
//delete(root,key)
return 0;
}
详情查看陈启峰大神的论文
Size Balance Tree(SBT模板整理)的更多相关文章
- Size Balanced Tree(SBT树)整理
不想用treap和Splay,那就用SB树把,哈哈,其实它一点也SB,厉害着呢. 先膜拜一下作者陈启峰.Orz 以下内容由我搜集整理得来. 一.BST及其局限性 二叉查找树(Binary Search ...
- 初学 Size Balanced Tree(bzoj3224 tyvj1728 普通平衡树)
SBT(Size Balance Tree), 即一种通过子树大小(size)保持平衡的BST SBT的基本性质是:每个节点的size大小必须大于等于其兄弟的儿子的size大小: 当我们插入或者删除一 ...
- Size Balanced Tree
Size Balanced Tree(SBT)是目前速度最快的平衡二叉搜索树,且能够进行多种搜索操作,区间操作:和AVL.红黑树.伸展树.Treap类似,SBT也是通过对节点的旋转来维持树的平衡,而相 ...
- Size Balanced Tree(SBT) 模板
首先是从二叉搜索树开始,一棵二叉搜索树的定义是: 1.这是一棵二叉树: 2.令x为二叉树中某个结点上表示的值,那么其左子树上所有结点的值都要不大于x,其右子树上所有结点的值都要不小于x. 由二叉搜索树 ...
- ACM算法模板整理
史诗级ACM模板整理 基本语法 字符串函数 istream& getline (char* s, streamsize n ); istream& getline (char* s, ...
- C基础 - 终结 Size Balanced Tree
引言 - 初识 Size Balanced Tree 最近在抽细碎的时间看和学习 random 的 randnet 小型网络库. iamrandom/randnet - https://github. ...
- 字符串系列——KMP模板整理
KMP模板整理 KMP与扩展KMP: /*vs 2017/ vs code以外编译器,去掉windows.h头文件和system("pause");*/ #include<i ...
- 子树大小平衡树(Size Balanced Tree,SBT)操作模板及杂谈
基础知识(包括但不限于:二叉查找树是啥,SBT又是啥反正又不能吃,平衡树怎么旋转,等等)在这里就不(lan)予(de)赘(duo)述(xie)了. 先贴代码(数组模拟): int seed; int ...
- Link-Cut Tree指针模板
模板: 以下为弹飞绵羊代码: #define Troy #include "bits/stdc++.h" using namespace std; ; inline int rea ...
随机推荐
- 打开MySQL数据库远程访问的权限
说明:转自,http://www.cnblogs.com/ycsfwhh/archive/2012/08/07/2626597.html 本人亲测方法1有效,方法2待验证 下载GPL版本安装 M ...
- YourSQLDba备份失败案例锦集
使用YourSQLDba做备份.维护.管理时,偶尔会收到一些备份失败的邮件.导致YourSQLDba备份失败的情况比价多,打算在此篇中对YourSQLDba备份失败的案例做一些总结.整理. 1:You ...
- .NET系列文章——近一年文章分类整理,方便各位博友们查询学习
由于博主今后一段时间可能会很忙(准备出书:<.NET框架设计—模式.配置.工具>,外加换了新工作),所以博客会很少更新: 在最近一年左右时间里,博主各种.NET技术类型的文章都写过,根据博 ...
- 从零自学Hadoop(15):Hive表操作
阅读目录 序 创建表 查看表 修改表 删除表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceL ...
- 分布式搜索引擎Elasticsearch的简单使用
官方网址:https://www.elastic.co/products/elasticsearch/ 一.特性 1.支持中文分词 2.支持多种数据源的全文检索引擎 3.分布式 4.基于lucene的 ...
- 记录一次MongoDB3.0.6版本wiredtiger与MMAPv1引擎的写入耗时对比
一.MongoDB3.0.x的版本特性(相对于MongoDB2.6及以下): 增加了wiredtiger引擎: 开源的存储引擎: 支持多核CPU.充分利用内存/芯片级别缓存(注:10月14日刚刚发布的 ...
- FusionCharts参数说明 (中文)
FushionCharts是把抽象数据图示化的套件,使用方便,配置简单.其相关参数中文说明如下. FusionCharts Free中文开发指南第二版.pdf 功能特性 animation ...
- linux fdisk命令使用
fdisk 对硬盘及分区的操作,进入fdisk 对硬盘操作阶段 我们可以对硬盘进行分区操作,前提是您把fdisk -l 弄明白了:通过fdisk -l ,我们能找出机器中所有硬盘个数及设备名称:比如上 ...
- 追MM的各种算法
原文:http://blog.sae.sina.com.cn/archives/3542#more-3542 看到一篇文章把算法描述的相当的好,先收藏了! 动态规划 基本上就是说:你追一个MM的时候, ...
- Serial Communication Protocol Design Hints And Reference
前面转载的几篇文章详细介绍了UART.RS-232和RS-485的相关内容,可以知道,串口通信的双方在硬件层面需要约定如波特率.数据位.校验位和停止位等属性,才可以正常收发数据.实际项目中使用串口通信 ...