BST讲解
BST
第一步,什么是BST,所谓BST就是满足一种特定性质的二叉树,这个性质一般情况是当前节点的权值比他的左子树的所有点的权值大,比他的右子树的所有点的权值小,满足这样性质的二叉树就称为BST,下面给一个例子。如图,就是一棵BST,显而易见,我们可以看出他的中序遍历是用点权从小到大排序之后的顺序。讲到这里,就会有人发问,如果有多个相同权值的点怎么办?定义里没有提到相同啊。这个问题很好回答,我们可以在维护BST的同时,维护一个数组,用来存当前节点的权值出现几次,输出时特殊处理就好啦(下图)。这就是BST,是不是很简单?代码实现也比较简单。
建树:我们想添加一个节点时,就可以从根节点开始寻找,每一次和当前节点相比,如果小于则递归左子树,如果大于则递归右子树,如果找到权值和他相等的点,ct直接加一就可以了,如果没有找到,我们就可以找到最末尾的点,直接在其后面挂上一个新的节点,代表这个值,ct=1。
void add(int &p,int number)
{
if(!p)
{
p=++idx;ct[p]=;
num[p]=number;
return;
}
if(num[p]<number) add(rson[p],number);
else add(lson[p],number);
}
//ct[p]代表p号节点出现的次数
//num[p]代表p号节点的权值
//lson[p]代表p号节点的左儿子的编号
//rson[p]代表p号节点的右儿子的编号
建树
输出:我们只需要写一个中序遍历就可以了,十分简单。
void put(int p)
{
if(lson[p]) put(lson[p]);
for(int i=;i<=many[p];i++)
printf("%d\n",val[p]);
if(rson[p]) put(rson[p]);
}
//many[p]记录p号节点出现的次数
//lson[p]记录p号节点的左儿子的编号
//rson[p]记录p号节点的右儿子的编号
//val[p]记录p号节点的权值
输出
第一次写BST的同学可以先写一下排序的题目,比如JDOJ1068排序和洛谷P1177,联系一下。
练习过后,可能有人会问,为什么过不去?TLE?这个问题实际上很好解释,如果插入时候是按照顺序插入的,就会变成一个链,这个很好理解,画一画就知道了。当退化成链的时候,时间复杂度就会退化成O(n^2),自然会TLE。
在这里我推荐两种做法,第一种是针对读入的顺序改变之后对答案没有影响的题,我们可以用random_shuffle()把数组打乱,这样的话P1177就可以轻松过了。
第二种就是Treap。这种做法可以写读入的顺序改变之后对答案有影响的题,具体讲解请看下一篇博客。
BST讲解的更多相关文章
- [LeetCode] Delete Node in a BST 删除二叉搜索树中的节点
Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...
- [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- [LeetCode] Largest BST Subtree 最大的二分搜索子树
Given a binary tree, find the largest subtree which is a Binary Search Tree (BST), where largest mea ...
- [LeetCode] Inorder Successor in BST 二叉搜索树中的中序后继节点
Given a binary search tree and a node in it, find the in-order successor of that node in the BST. No ...
- [LeetCode] Kth Smallest Element in a BST 二叉搜索树中的第K小的元素
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- BST 解析 (一)
这篇博文主要初步介绍Binary Search Tree(BST)的一些基本功能以及应用场景,由于BST的相关知识比较多,下一节会接着补充BST的一些功能.这一节主要分为以下三个要素: BST 的定义 ...
- BST 解析 (二)height and deletion
前面一章介绍了BST的结构和一些简单的基本功能,例如:insert,findMin,nextLarger等等.这一节主要讲解一些BST的delete node操作还有BST的height的分析以及一些 ...
- Treap讲解
Treap讲解 上一篇blog提出了Treap这个算法,在这里我就要详细讲解. 首先,我们可以从字面上理解这个算法,Treap这个单词是由Tree和Heap两个单词构成的,所以它的性质就很好理解了,明 ...
- [LeetCode] Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...
随机推荐
- MySQL使用和操作总结
简介 MySQL是一种DBMS,即它是一种数据库软件.DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机——服务器的DBMS.前者用于桌面用途,通常不用于高端或更关键应用. My ...
- sql模糊查询效率
在数据库量比较大的时候通常有一些查询,例如查询文本类型的数据,存储量大,用like进行模糊查询效率实在太低 select * from stdcontent where content like ' ...
- 如何使用 RESTClient 调试微信支付接口
我们知道微信支付使用http协议进行api调用,body 使用xml格式,使用的一般http在线调试工具,无法进行xml数据的post. RESTClient 做的很好,支持各种http 方法,bod ...
- Android中文API (110) —— CursorTreeAdapter
前言 本章内容是android.widget.CursorTreeAdapter,版本为Android 3.0 r1,翻译来自"深夜未眠",欢迎访问它的博客:"http: ...
- swift 相关小随笔
关键词 typealias 对已经存在的类重命名 let 修饰不可变值 var 修饰可变的值 lazy 懒加载修饰符,用到的时候才会加载 convenience 原方法的备用方法,方法一致,但是 ...
- Go实现海量日志收集系统(二)
一篇文章主要是关于整体架构以及用到的软件的一些介绍,这一篇文章是对各个软件的使用介绍,当然这里主要是关于架构中我们agent的实现用到的内容 关于zookeeper+kafka 我们需要先把两者启动, ...
- IntelliJ IDEA的入门使用
1 修改背景颜色 点击File,Settings 2 修改字体格式,以及字体大小 我个人习惯Eclipse的默认字体,所有把字体修改成Eclipse默认的Consolas 同上点击File,Setti ...
- jsonp处理
def loads_jsonp(self,_jsonp): try: return json.loads(re.match(".*?({.*}).*",_jsonp,re.S).g ...
- 关于安装wordpress出现500 Internal Server Error的解决方案
安装新版本wordpress出现500 Internal Server Error的问题: 在./wp-includes/class-http.php的268行,改成 $request_order = ...
- python3爬虫之入门和正则表达式
前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享:爬虫说的简单,就是去抓取网路的数据进行分析处理:这章主要入门,了解几个爬虫的小测 ...