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讲解的更多相关文章

  1. [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 ...

  2. [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  3. [LeetCode] Largest BST Subtree 最大的二分搜索子树

    Given a binary tree, find the largest subtree which is a Binary Search Tree (BST), where largest mea ...

  4. [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 ...

  5. [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 ...

  6. BST 解析 (一)

    这篇博文主要初步介绍Binary Search Tree(BST)的一些基本功能以及应用场景,由于BST的相关知识比较多,下一节会接着补充BST的一些功能.这一节主要分为以下三个要素: BST 的定义 ...

  7. BST 解析 (二)height and deletion

    前面一章介绍了BST的结构和一些简单的基本功能,例如:insert,findMin,nextLarger等等.这一节主要讲解一些BST的delete node操作还有BST的height的分析以及一些 ...

  8. Treap讲解

    Treap讲解 上一篇blog提出了Treap这个算法,在这里我就要详细讲解. 首先,我们可以从字面上理解这个算法,Treap这个单词是由Tree和Heap两个单词构成的,所以它的性质就很好理解了,明 ...

  9. [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 ...

随机推荐

  1. 0x00-Kali Linux 系列入门篇

    Kali Linux介绍篇 Kali Linux 官网:https://www.kali.org/ Kali Linux 前身是著名渗透测试系统BackTrack ,是一个基于 Debian 的 Li ...

  2. Factorials

    Factorials 阶乘 题目大意:给你一个数n,求出n ! 的最后一个非零位. 注释:n<=4200 想法:开始的想法是觉得这道题应该比较的有趣,因为我们知道,一个数的阶乘的最后的非零位后面 ...

  3. 几条常见的数据库分页 SQL 语句

    SQL Server 先从想要的数据处理加上Row_number()来为数据的row加上一个RowNum作为有多少条数据,然后再用BETWEEN来分隔 with t1 as (select * ,  ...

  4. 数据库数据带&符号 导入有问题的处理办法

    在sql文件头部加个: set feedback off set define off   我们在plsql里面将一条语句导出时会出现以下结果(测试表t_test): prompt Importing ...

  5. C语言--第一周作业(更改)

    *********************学习总结********************* 1.所用词典: 2.Git截图: *********************遇到的问题和解决方法***** ...

  6. 201621123043 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  7. 开始 Python 之旅

    开始 Python 之旅 课程来源 本课程基于 Python for you and me 教程翻译制作,其中参考了 Python tutorial 和 The Python Standard Lib ...

  8. 新手入门 git

    Git是目前世界上最先进的分布式版本控制系统 特点:高端大气上档次 什么是版本控制系统 系统自动记录文件改动 方便同事协作管理 不用自己管理一堆类似的文件了,也不需要把文件传来传去.如果想查看某次改动 ...

  9. django启动uwsgi报错

    查看uwsgi.log *** Starting uWSGI 2.0.17 (64bit) on [Thu Apr 5 17:46:15 2018] *** compiled with version ...

  10. python小练习之一

    下面的练习本身不难,比如打印1到10,计算1+2+3+...+100 ,最后一个是计算 1-2+3-4...-100 用了类的方法实现 用了列表生成器 用"高级"一丢丢的写法来实现 ...