关于SBT的介绍及学习,请戳这里。

SBT模版:

/*************************************************
数据结构:
SBT(Size Balanced Tree),又称傻逼树;数据域:
值域key,左孩子left,右孩子right,保持平衡的size;性质:
每棵子树的大小不小于其兄弟的子树大小;插入:
插入算法先简单插入节点,然后调用一个维护过程以保持性质;删除:
删除操作与普通维护size域的二叉查找树相同;最大值和最小值:
由于SBT本身已经维护了size域;
所以只需用Select(T,1)来求最大值;
Select(T,T.size)求最小值;
其中Select(T,k)函数返回树T在第k位置上的节点值;
**************************************************/
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<climits>
#include<algorithm>
using namespace std;const int N = 100000;
int key[N], lefts[N], rights[N], size[N];
int u;//根结点
int node;inline void Left_Rotate(int &x)
{int k = rights[x];rights[x] = lefts[k];lefts[k] = x;size[k] = size[x];size[x] = size[lefts[x]] + size[rights[x]] + 1;x = k;
}inline void Right_Rotate(int &y)
{int k = lefts[y];lefts[y] = rights[k];rights[k] = y;size[k] = size[y];size[y] = size[lefts[y]] + size[rights[y]] + 1;y = k;
}void Maintain(int &u, bool flag)//维护
{if(flag == false){if(size[lefts[lefts[u]]] > size[rights[u]])Right_Rotate(u);else{if(size[rights[lefts[u]]] > size[rights[u]]){Left_Rotate(lefts[u]);Right_Rotate(u);}else return;}}else{if(size[rights[rights[u]]] > size[lefts[u]])Left_Rotate(u);else{if(size[lefts[rights[u]]] > size[lefts[u]]){Right_Rotate(rights[u]);Left_Rotate(u);}else return;}}Maintain(lefts[u], false);Maintain(rights[u], true);Maintain(u, true);Maintain(u, false);
}void Insert(int &u, int v)//插入结点
{if(u == 0){key[u = ++node] = v;size[u] = 1;}else{size[u]++;if(v < key[u])Insert(lefts[u], v);elseInsert(rights[u], v);Maintain(u, v >= key[u]);}
}int Delete(int &u, int v)//删除结点
{size[u]--;if( (v == key[u]) || (v < key[u] && lefts[u] == 0) || (v > key[u] && rights[u] == 0) ){int r = key[u];if(lefts[u] == 0 || rights[u] == 0)u = lefts[u] + rights[u];elsekey[u] = Delete(lefts[u], key[u] + 1);return r;}else{if(v < key[u])return Delete(lefts[u], v);elsereturn Delete(rights[u], v);}
}int Search(int x, int k)//查询
{if(x == 0 || k == key[x])return x;if(k < key[x])return Search(lefts[x], k);elsereturn Search(rights[x], k);
}int Select(int u, int k)//返回树在第k位置上的结点值
{int r = size[lefts[u]] + 1;if(k == r)return key[u];else if(k < r)return Select(lefts[u], k);elsereturn Select(rights[u], k - r);
}int Successor(int u, int k)//查询结点k的后继
{if(u == 0)return k;if(key[u] <= k)return Successor(rights[u], k);else{int r = Successor(lefts[u], k);if(r == k)return key[u];elsereturn r;}
}int Predecessor(int u, int k)//查询结点k的前驱
{if(u == 0)return k;if(key[u] >= k)return Predecessor(lefts[u], k);else{int r = Predecessor(rights[u], k);if(r == k)return key[u];elsereturn r;}
}int Rank(int u, int k)//排名(rank),也叫秩,求整棵树中从大到小排序的第k位元素;
{if(u==0)return 1;if(key[u] >= k)return Rank(lefts[u], k);elsereturn size[lefts[u]] + Rank(rights[u], k) + 1;
}int main()
{int n;scanf("%d",&n);for(int i=0; i<n; i++){int cmd,x;scanf("%d%d",&cmd,&x);switch(cmd){case 1:Insert(u,x);break;case 2:Delete(u,x);break;case 3:printf("%d\n", Search(u,x));break;case 4:printf("%d\n", Rank(u,x));break;case 5:printf("%d\n", Select(u,x));break;case 6:printf("%d\n", Predecessor(u,x));break;case 7:printf("%d\n", Successor(u,x));break;}}return 0;
}

SBT模版(Size Balanced Tree)相关推荐

  1. CQF平衡树——SBT论文——Size Balanced Tree

    Size Balanced Tree Size Balanced Tree(SBT)是一种平衡二叉查找树.它的论文由中国广东中山纪念中学的陈启峰于2006年底完成,并在Winter Camp 2007 ...

  2. 陈启峰SBT(Size Balanced Tree )平衡搜索二叉树

    http://wenku.baidu.com/view/40aa82c7aa00b52acfc7ca60.html 初学SBT,后附代码 转载于:https://www.cnblogs.com/huz ...

  3. 竞赛最好用的平衡树-Size Balanced Tree(SBT)【建议收藏】

    大家好. 前段时间我更新过AVL.红黑树以及搜索二叉树的简单讲解.今天我们还是围绕着平衡树的话题,来讲解一个很牛逼的平衡树结构.这种结构是我国的一位大牛:陈启峰.在2006年,他还在读高中阶段,所发明 ...

  4. Size Balanced Tree

    Size Balanced Tree(SBT)是目前速度最快的平衡二叉搜索树,且能够进行多种搜索操作,区间操作:和AVL.红黑树.伸展树.Treap类似,SBT也是通过对节点的旋转来维持树的平衡,而相 ...

  5. 陈启峰 Size Balanced Tree

    今天上网搜索关于红黑树的资料时,发现一种新的平衡二叉树(SBT),据说各方面性能很好,先摘录在此,以后再细看. Size Balanced Tree(SBT)是一种平衡二叉查找树.它的论文由中国广东中 ...

  6. size balanced tree (平衡二叉树) ----- 傻X树----陈启峰论文

    Size Balanced Tree(SBT)是一种平衡二叉查找树.它的论文由中国广东中山纪念中学的陈启峰于2006年底完成, 并在Winter Camp 2007中发表.由于SBT的拼写很容易找到中 ...

  7. C基础 - 终结 Size Balanced Tree

    引言 - 初识 Size Balanced Tree 最近在抽细碎的时间看和学习 random 的 randnet 小型网络库. iamrandom/randnet - https://github. ...

  8. Size Balanced Tree(节点大小平衡树)

    定义 SBT也是一种自平衡二叉查找树,它的平衡原理是每棵树的大小不小于其兄弟树的子树的大小 即size(x->l)$\ge$size(x->r->l),size(x->r-&g ...

  9. 2022 Jiangsu Collegiate Programming Contest - J. Balanced Tree

    L. Collecting Diamonds 题目描述 A binary tree T is called super balanced if T is empty or satisfies the ...

最新文章

  1. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
  2. settimeout需要清除吗_【期刊导读】新证据:HBsAg水平极低的非活动性HBsAg携带者经聚乙二醇干扰素治疗24周, HBsAg清除率高达83.3%...
  3. sdr 软件_SDR 软件定义的无线电
  4. execve函数的介绍与使用
  5. SQL Server中CROSS APPLY和OUTER APPLY的应用详解
  6. python通过requirements.txt文件批量安装依赖包的实现步骤
  7. java获取某日期之前/之后一天的日期(实现代码)
  8. 理解文档对象模型(3)
  9. oracle dbms_crypto,DBMS_CRYPTO包对Oracle加密
  10. javascript中类的定义和使用{转载}
  11. 正则判断手机号地区_匹配中国大陆所有手机号正则表达式
  12. 美国大学 计算机专业 排名,2019美国大学计算机专业排名
  13. 计算机启动时检测硬盘,电脑总是启动检测硬盘怎么办
  14. 每日新闻早报简报十条和1条微语分享
  15. 「管理数学基础」2.3 泛函分析:赋范空间与巴拿赫空间
  16. C语言system讲解
  17. 已有Android工程集成DCloud页面
  18. 微型计算机赛睿寒冰5评测,为什么说寒冰5才是赛睿性价比最高的游戏耳机?
  19. 记录一下web端调用IC卡读卡器的大致流程
  20. Windows内核与原理读书笔记之DPC和时钟中断和定时器管理

热门文章

  1. 并发工具类纵览——建立起Java并发体系的大厦
  2. 模版设计模式概述和使用
  3. 使用递归计算1-n之间的和
  4. 入门程序之入门代码编写
  5. 制作模块-安装模块压缩包
  6. 学完java学swift_前言最近学完Swift之后一直没有机会实战,发现由于Swift发展历史原因,目前网上大部分的算法都是使用C、Java或其他语言实现的,几乎没有使用Swift实...
  7. linux7添加两个网关,RHEL7设置IP地址、网关和DNS
  8. TVS 击穿电压和钳位电压的区别
  9. 开机慢 不换SSD如何提升Windows 10开机速度
  10. 《大数据分析原理与实践》一一第3章 关联分析模型