二叉查找树学习笔记(BST)
我土了....终于开始看平衡树了,以前因为害怕一直不敢看数据结构...浑浑噩噩跟同学落了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)的更多相关文章
- BST,Splay平衡树学习笔记
BST,Splay平衡树学习笔记 1.二叉查找树BST BST是一种二叉树形结构,其特点就在于:每一个非叶子结点的值都大于他的左子树中的任意一个值,并都小于他的右子树中的任意一个值. 2.BST的用处 ...
- 「学习笔记」Treap
「学习笔记」Treap 前言 什么是 Treap ? 二叉搜索树 (Binary Search Tree/Binary Sort Tree/BST) 基础定义 查找元素 插入元素 删除元素 查找后继 ...
- Treap-平衡树学习笔记
平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...
- 平衡树splay学习笔记#2
讲一下另外的所有操作(指的是普通平衡树中的其他操作) 前一篇的学习笔记连接:[传送门],结尾会带上完整的代码. 操作1,pushup操作 之前学习过线段树,都知道子节点的信息需要更新到父亲节点上. 因 ...
- 《it项目管理那些事》学习笔记
此书适合:计算及相关专业的学生,想成为测试工程师.软件工程师.进入项目经理的人,或者经验丰富的it经理人. 之所以称为学习笔记,是加上我从百度搜到一些在看书过程中不明白的it语,作为菜鸟的我,得多看看 ...
- [学习笔记]平衡树(Splay)——旋转的灵魂舞蹈家
1.简介 首先要知道什么是二叉查找树. 这是一棵二叉树,每个节点最多有一个左儿子,一个右儿子. 它能支持查找功能. 具体来说,每个儿子有一个权值,保证一个节点的左儿子权值小于这个节点,右儿子权值大于这 ...
- 23 DesignPatterns学习笔记:C++语言实现 --- 2.1 Bridge
23 DesignPatterns学习笔记:C++语言实现 --- 2.1 Bridge 2016-07-22 (www.cnblogs.com/icmzn) 模式理解
- 23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory
23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory 2016-07-18 13:03:43 模式理解
- LinkCutTree学习笔记
LinkCutTree 学习笔记 参考来源 https://www.zybuluo.com/xzyxzy/note/1027479 https://www.cnblogs.com/zhoushuyu/ ...
随机推荐
- 1.Eclipse下载、常用配置、快捷键
Eclipse官网下载:https://www.eclipse.org/downloads/packages/ 自动补全 位置:Eclipse——Window——Perferences——Java—— ...
- BZOJ - 2783 树
数列 提交文件:sequence.pas/c/cpp 输入文件: sequence.in 输出文件: sequence.out 问题描述: 把一个正整数分成一列连续的正整数之和.这个数列必须包含至少两 ...
- 如何使用Externalizable接口自定义Java中的序列化
Java序列化过程的缺点 我们都知道如何使用Serializable接口序列化/反序列化一个对象,并且如何使用writeObject 和readObject方法自定义序列化过程. 但是这些自定义还不够 ...
- xtrabackup 备份+还原
1.安装下载地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/ 2.备份# innobackupex --defaults- ...
- python服务端工程师就业面试指导☝☝☝
python服务端工程师就业面试指导 由Python专业面试官打造的课,少之又少,专业代表着经验,代表着对考察点的通透理解,更代表着对你负责 第1章 Python工程师offer直通车(视频+教辅文档 ...
- 数据挖掘:python数据清洗cvs里面带中文字符
数据清洗,使用python数据清洗cvs里面带中文字符,意图是用字典对应中文字符,即key值是中文字符,value值是index,自增即可:利用字典数据结构没有重复key值的特性,把中文字符映射到了数 ...
- libevent::事件::定时器2
#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) #include <cstdio> #include ...
- React学习系列之(1)简单的demo(React脚手架)
1.什么是React? React是一个一个声明式,高效且灵活的用于构建用户界面的JavaScript库.React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 ...
- 时序数据库InfluxDB(I)- 搭建与采集信息demo操作
搭建环境:vmware workstation pro15.5.0, ubuntu18.04.3 实践时间:2019.10.12-10.27 (一)时序数据库InfluxDB准备 (1)安装 曾出现问 ...
- sql查询入门
SQL语言是一门相对来说简单易学却又功能强大的语言,它能让你快速上手并很快就能写出比较复杂的查询语句.但是对于大多数开发者来说,使用SQL语句查询数据库的时候,如果没有一个抽象的过程和一个合理的步骤, ...