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 ...
随机推荐
- 控制input只能输入数字和两位小数
<input type="text" name="je" onkeyup="clearNoNum(this)" /> funct ...
- Laravel 模型事件入门
Laravel 模型事件允许你监听模型生命周期内的多个关键点,甚至可以在阻止一个模型的保存或者删除. Laravel 模型事件文档 概述了如何使用钩子将对应事件与相关的事件类型关联起来,但是本文的主旨 ...
- [bzoj1565][NOI2009]植物大战僵尸_网络流_拓扑排序
植物大战僵尸 bzoj1565 题目大意:给你一张网格图,上面种着一些植物.你从网格的最右侧开始进攻.每个植物可以对僵尸提供能量或者消耗僵尸的能量.每个植物可以保护一个特定网格内的植物,如果一个植物被 ...
- linq分组求和_实体类和datatable
1.数据分组求合,分别用的实体类以及datatable来分组求合,还有分组求和之后的如何取值 //实体类版本 List<ProgramTimeModel> TotalAllList = G ...
- Linux下的/etc/hosts文件
在Unix系统下面有一个/etc/hosts文件,在我的Mac上,这个文件的内容如下: ## # Host Database # # localhost is used to configure th ...
- 面试常考---html篇
1.html5新特性,语义化 HTML5为我们提供了一系列的语义标签. 1.<section></section> 定义文档中的主体部分的节.段. 2.<article& ...
- PTA常见错误
1.最常犯的错误. 格式错误 在PTA程序检测中,输入输出要严格按照题目要求.输出的格式要完全按照题目要求来,该空格地方空格,该换行要换行.否则,就算你运行结果是对的,PTA还是提示你格式错误 比如下 ...
- Django 分类标签查找
from django.conf.urls import url from django.contrib import admin from blog.views import index,stude ...
- android 时间获取以及时间格式化
Android中获取系统时间有多种方法,可分为Java中Calendar类获取,java.util.date类实现,还有android中Time实现 现总结如下: 方法一: void getTime1 ...
- a标签传递参数
a标签传递参数 单个参数:参数名称前面跟 ? <a href="localhost:8080/arguments?id=1">单个参数</a> 多个参数 ...