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 ...
随机推荐
- 手把手 git建立仓库,远程推拉及常用git命令和部分Linux命令集锦
方法一:直接在GitHub上建立一个项目,然后git clone (git address name): 此时已经建立好了一个git仓库: cd 文件夹 > 添加文件进去 >git add ...
- struct_2拦截器与过滤器
这个为网上所剪切的知识点,仅为个人学习所用,无其他用途. 过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者 ...
- Entity Framework——并发策略
使用EF框架遇到并发时,一般采取乐观并发控制. 1支持并发检验 为支持并发检验,需要对实体进行额外的设置.默认情况下是不支持并发检验的.有以下两种方式: 方式名称 说明 时间戳注解/行版本 使用Tim ...
- CSS服务器字体
1,首先要下载ttf文件 推荐下载网站: https://www.dafont.com/ 2,写css样式 3,服务器字体 font-family:自己随便取个名字就行 注意url里的ttf文件和f ...
- X-pack安装
1. Install X-Pack into Elasticsearch docker exec -it anyrobot-store /bin/bash bin/elasticsearch- ...
- Git 建立仓库及常用命令速查表
Git新建仓库两种模式: 一.项目在本地时,本地初始化仓库并提交至Coding.Net 新建一个空白目录并进入,执行如下流程 1.git init2.项目代码复制到当前目录3.git add *4.g ...
- 铜齿铁牙UP计划
铜齿铁牙UP计划 我在""做教练"之好声音训练"给出了老师.播音主持学习者,声乐学习者科学用声三要点: 用气发声 共鸣发声 虚实结合 用气发声首先要学会腹式呼吸 ...
- 网络1711c语言第0次作业总结
作业地址:https://edu.cnblogs.com/campus/jmu/JMUC--NE17111712/homework/861 总结 1.评分标准 以下要求中除了未交和抄袭0分,其他项最多 ...
- Week03-面向对象入门
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等 类 对象 封装 继承 覆盖 重载 构造函数 static public private toString f ...
- 四则运算----C++版
一.设计思想 因java中已做过,就是简单的将java中的语句调换为C++的语句. 二.代码 #include<iostream.h> #include<Stdlib.h> v ...