我土了....终于开始看平衡树了,以前因为害怕一直不敢看数据结构...浑浑噩噩跟同学落了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. 网络下载器 Internet Download Manager v6.35.5 绿色便携版

    Internet Download Manager,简称 IDM,是国外的一款优秀网络下载工具.目前凭借着下载计算的速度优势在外媒网站中均受好评,现在已被多数国人熟知.Internet Downloa ...

  2. CSDN VIP如何添加引流自定义栏目

    几个月前我也开始在csdn上开了博客,一来给自己加几个少的可怜的流量,再者,让公众号的原创文章获得更多的曝光,让有需要的同学看到. 写过csdn博客的同学都知道,默认只有打赏c币功能:也没有专门广告位 ...

  3. JDK1.7中HashMap死环问题及JDK1.8中对HashMap的优化源码详解

    一.JDK1.7中HashMap扩容死锁问题 我们首先来看一下JDK1.7中put方法的源码 我们打开addEntry方法如下,它会判断数组当前容量是否已经超过的阈值,例如假设当前的数组容量是16,加 ...

  4. GDB使用总结

    1. GDB概述 GNU发布的调试器,可以查看程序如何运行或崩溃时的状态. 主要功能: 启动程序,可以按照自定义的要求运行程序. 可让被调试的程序在你所指定的断点处停住. 当程序被停住时,可以检查此时 ...

  5. 本人亲测-百度富文本编辑器(无bug版本)

    再此我想说明一点,好多教程都是转载别人的,而且也不注明从哪里转载的.每次搜点资料的时候总是跟网上刷小视频的感觉一样.有些人就直接把别人的东西粘贴过来了,一点改动都没有. 废话不多说,直接上教程. (百 ...

  6. 手写OOXML文档——导出xlsx格式表格文档

    一.准备工作: 2个js库,另外把样式文件抽离出来 require('file-saver'); import JSZip from 'jszip' import {stylesData,theme1 ...

  7. 你真的了解Web前端开发吗?未来前端远比你想的有前途!

    近几年来,随着 HTML5.JS 的流行,前端这个职业火热了起来!不少人发出疑惑,前端以后还会更有前途吗? 我只能告诉你:前端不灭 现在都明白了用户体验至上,还要用着舒服 后端提供床,前端提供颜值高的 ...

  8. Oracle基于布尔的盲注总结

    0x01 decode 函数布尔盲注 decode(字段或字段的运算,值1,值2,值3) 这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回3 当然值1,值2,值3也可以 ...

  9. 《Java并发编程实战》读书笔记-第2章 线程安全性

    要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问. 修复多线程问题的方式: 不在线程之间共享该状态变量 将状态变量修改为不可变的变量 在访问状态变量时使用同步 ...

  10. 2.Linux Bash认识

    虚拟机快照操作 1.什么是Bash shell? 它就是命令解释器,将用户输入的指令翻译给内核程序,内核处理完成之后将结果返回给Bash 2.Bash shell的用途? 几乎能完成所有的操作: 文件 ...