我土了....终于开始看平衡树了,以前因为害怕一直不敢看数据结构...浑浑噩噩跟同学落了1—2个数据结构没看....果然,我是最弱的

二叉查找树,遵守每个点的左儿子小于点小于右儿子。

于是,BST能够支持的操作:

加点(不用说了)

找前驱(小于一个值的最大值)

找后继(大于一个值得最小值)

根据排名找值

根据值找排名。

直接上代码,理解讲解都在注释里(只给各个函数的代码了)

struct tree
{
int ls,rs,size,cnt,val;
}t[maxn]; //以下为加点
//size表示当前节点的子树大小和自己的大小的和,
//cnt表示当前节点代表的数有几个
void add(int now,int val)//now为当前遍历的点的编号,val为点权值
{
t[now].size++;
if(t[now].val==val)
{
t[now].cnt++;//多个相同值得点,不增加点了
return;
}
if(t[now].val>val)
{
if(t[now].ls!=)
{
addedge(t[now].ls,val);
}
else
{
cnt++;
t[cnt].size=;
t[cnt].val=val;
t[cnt].cnt=;
t[now].ls=cnt;
}
}
else
if(t[now].val<val)//根据二叉查找树的性质来插值
{
if(t[now].rs!=)//如果不是叶子节点
{
addedge(t[now].rs,val);//向下寻找叶子节点再插入
}
else
{
cnt++;//cnt为点的编号
t[cnt].size=;//找前驱的东西
t[cnt].val=val;//存值
t[cnt].cnt=;//有几个相同的值
t[now].rs=cnt;//点的编号,右儿子加点
}
}
}
int getqianqu(int now,int val,int ans)
{
if(t[now].val>=val)//如果当前值大于正在被寻找前驱的值
{//那么可以判定:前驱一定是在它的左子树中
if(t[now].ls==)//如果没有左子树
{
return ans;//当前值就是答案
}
else //否则
{
getqianqu(t[now].ls,val,ans);//在左子树中找答案
}
}
else if(t[now].val<val)//如果当前值小于正在被寻找前驱的值
{//那么可以判定:前驱一定在它的右子树中 ,一路小过来,小过了,往大值试探
if(t[now].rs==)//如果没有右子树
{
if(t[now].val<val)//如果当前值小于正在被寻找前驱的值
{
return t[now].val;//在没有右子树的情况下,当前点就是前驱
}
else
{
return ans;//否则前面点就是前驱
}
}
if(t[now].cnt!=)//删点之后..在treap里的操作,这里没有
{
return getqianqu(t[now].rs,val,t[now].val);
}
else
{
return getqianqu(t[now].rs,val,ans);
}
}
}
int gethouji(int now,int val,int ans)
{
if(t[now].val<=val)//如果当前值大于正在被寻找前驱的值
{
if(t[now].rs==)//如果没有左儿子
{
return ans;
}
else
{
gethouji(t[now].rs,val,ans);
}
}
else if(t[now].val>val)
{
if(t[now].ls==)
{
if(t[now].val>val)
{
return t[now].val;
}
else
{
return ans;
}
}
if(t[now].cnt!=)
{
return gethouji(t[now].ls,val,t[now].val);
}
else
{
return gethouji(t[now].ls,val,ans);
}
}
}
//size表示当前节点的子树大小和自己的大小的和,
//cnt表示当前节点代表的数有几个
int nth(int now,int rank)
{
if(now==)//0,没有值
{
return 0x7fffffff;
}
if(t[t[now].ls].size>rank)//如果左子树的子树的大小大于nth
{
return nth(t[now].ls,rank);//去找左子树
}
if(t[t[now].ls].size+t[now].cnt>=rank)//如果左子树的子树的大小+当前节点(重复节点)大于等于nth
{
return t[now].val;//那这个点就是nth
}
return nth(t[now].rs,rank-t[t[now].ls].size-t[now].cnt);//找子树中nth-子树大小的值
}
int valth(int now,int val)
{
if(now)==)
{
return ;
}
if(val==t[now].val)
{
return t[t[now].ls].size+;
}
if(val<t[now].val)
{
return valth(t[now].ls,val);
}
return valth(t[now].rs,val)+t[t[now].ls].size+t[now].cnt;
}//基本同理于kth

(完)

二叉查找树学习笔记(BST)的更多相关文章

  1. BST,Splay平衡树学习笔记

    BST,Splay平衡树学习笔记 1.二叉查找树BST BST是一种二叉树形结构,其特点就在于:每一个非叶子结点的值都大于他的左子树中的任意一个值,并都小于他的右子树中的任意一个值. 2.BST的用处 ...

  2. 「学习笔记」Treap

    「学习笔记」Treap 前言 什么是 Treap ? 二叉搜索树 (Binary Search Tree/Binary Sort Tree/BST) 基础定义 查找元素 插入元素 删除元素 查找后继 ...

  3. Treap-平衡树学习笔记

    平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...

  4. 平衡树splay学习笔记#2

    讲一下另外的所有操作(指的是普通平衡树中的其他操作) 前一篇的学习笔记连接:[传送门],结尾会带上完整的代码. 操作1,pushup操作 之前学习过线段树,都知道子节点的信息需要更新到父亲节点上. 因 ...

  5. 《it项目管理那些事》学习笔记

    此书适合:计算及相关专业的学生,想成为测试工程师.软件工程师.进入项目经理的人,或者经验丰富的it经理人. 之所以称为学习笔记,是加上我从百度搜到一些在看书过程中不明白的it语,作为菜鸟的我,得多看看 ...

  6. [学习笔记]平衡树(Splay)——旋转的灵魂舞蹈家

    1.简介 首先要知道什么是二叉查找树. 这是一棵二叉树,每个节点最多有一个左儿子,一个右儿子. 它能支持查找功能. 具体来说,每个儿子有一个权值,保证一个节点的左儿子权值小于这个节点,右儿子权值大于这 ...

  7. 23 DesignPatterns学习笔记:C++语言实现 --- 2.1 Bridge

    23 DesignPatterns学习笔记:C++语言实现 --- 2.1 Bridge 2016-07-22 (www.cnblogs.com/icmzn) 模式理解  

  8. 23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory

    23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory 2016-07-18 13:03:43 模式理解

  9. LinkCutTree学习笔记

    LinkCutTree 学习笔记 参考来源 https://www.zybuluo.com/xzyxzy/note/1027479 https://www.cnblogs.com/zhoushuyu/ ...

随机推荐

  1. .Net Core Serverless初体验

    什么是Serverless Serverless 是一个当今软件世界中比较新的话题.它并没有一个普遍公认的权威定义,每个人每个企业对它的解释可能都有不同,而 Serverless 正是在这种情况下不断 ...

  2. 利用C++实现模块隐藏(R3层断链)

    一.模块隐藏的实现原理 普通API查找模块实现思路:其通过查询在R3中的PEB(Process Environment Block 进程环境块)与TEB(Thread Environment Bloc ...

  3. 《Windows内核分析》专题-索引目录

    该篇博客整理了<Windows内核分析>专题的各篇博文,方便查找. 一.保护模式 二.进程与线程 [Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Cont ...

  4. 2018 php 面试

    排序算法 快速排序 快速排序是十分常用的高效率的算法,其思想是:先选一个标尺,用它把整个队列过一遍筛选,以保证左边的元素都不大于它,其右边都不小于它 function quickSort($arr){ ...

  5. Linux快速入门

    一.Linux介绍 1.Linux是基于Unix的开源免费的操作系统 2.Linux的分类: (1)Linux根据市场需求不同,基本分为两个方向: 1)图形化界面版:注重用户体验,类似window操作 ...

  6. Integer类型与int的==比较

    前言 Java中有两种类型 基本类型 基本数据类类型存的是数值本身 引用类型 引用类型变量在内存放的是数据的引用 基本类型通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址 正文 在一些特 ...

  7. Java序列化总结(最全)

    概念 实现 Serializable 接口, 它只是一个标记接口,不实现也能够进行序列化 RMI: 远程方法调用 RPC: 远程过程调用 序列化ID 解决了序列化与反序列出现代码不一致的问题, 不一致 ...

  8. Ubuntu cd后自动执行ls或ll

    编辑 .bashrc 文件 sudo gedit ~/.bashrc 在最后一行加入 cdAndList() { cd "${1}"; ls; } alias cd=cdAndLi ...

  9. 事业单位招聘网搭建思路和seo方法

    期望目标 自动采集事业单位招聘信息+自动发布到网站+自动提交网址到百度+自动发外链. 技术框架 前端用layUI,后端用flask,数据库用的elasticsearch,编程语言用Python 3.7 ...

  10. date命令查看与修改

    在我们使用linux服务器时,肯定会遇到Linux服务器时间不准确的情况如何查看Linux系统的时间,如何修改Linux系统上的当前时间呢. 查看Linux系统当前时间: 命令: date +回车 修 ...