数据结构录 之 BST的高级应用。
BST就是二叉检索树,或者是二叉排序树,或者叫二叉搜索树等等。
BST的平衡问题可以去学习AVL树或者Treap或者Splay这些平衡树。
BST的一些高级应用:
1,求BST中比k小的数的个数:
只需在BST上面多维护值size,表示当前这个节点的子树的点的个数。
伪代码如下:
BST tree;
int getCou(int k) {
Node * u=tree.root;
int ret=;
while(u!=NULL) {
if(u->val<k) { // 如果当前节点值小于k,那么左子树也符合。
ret+=+size(u->left);
u=u->right;
}
else u=u->left; // 如果大于等于k的话,右子树一定不符合。
}
return ret;
}
复杂度是logN的。
2,求BST中第x小的数是几?
仍然需要维护size数组。
如果左子树点的个数超过x了,说明第x个在左子树,否则在右子树。
BST tree;
int getXth(int x) {
Node * u=tree.root;
while(u!=NULL) {
if(size(u->left)<x) { // 如果左子树个数不足x,递归找右子树。
x-=size(u->left)+; // 递归时在x要变化。
if(x==) return u; // 找到了。
u=u->right;
}
else u=u->left; // 递归找左子树。
}
return -;
}
复杂度logN。
3,找到BST中正好比k大的第一个数:
仍然是从root开始找。
代码如下:
BST tree;
int find(int k) {
Node * u=tree.root;
int ret=INF;
while(u!=NULL) {
if(u->val>k) { // 如果当前节点大,那么他的右子树都比当前节点大,答案一定不如当前节点的值优。
ret=min(ret,u->val);
u=u->left;
}
else u=u->right; // 左子树都小,都不符合,所以找右子树去。
}
return ret;
}
复杂度 logN 。
数据结构录 之 BST的高级应用。的更多相关文章
- 数据结构录 之 单调队列&单调栈。
队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调 ...
- 数据结构录 之 单调队列&单调栈。(转)
http://www.cnblogs.com/whywhy/p/5066306.html 队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇 ...
- 数据结构------------------二叉查找树(BST)的java实现
数据结构------------------二叉查找树(BST)的java实现 二叉查找树(BST)是一种能够将链表插入的灵活性和有序数组查找的高效性相结合的一种数据结构.它的定义如下: 二叉查找树是 ...
- 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)
前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...
- 【授课录屏】JavaScript高级(IIFE、js中的作用域、闭包、回调函数和递归等)、MySQL入门(单表查询和多表联查)、React(hooks、json-server等) 【可以收藏】
一.JavaScript授课视频(适合有JS基础的) 1.IIFE 2.js中的作用域 3.闭包 4.表达式形式函数 5.回调函数和递归 资源地址:链接:https://pan.baidu.com/s ...
- Python高级数据结构-Collections模块
在Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了之中,认识了python基本的数据类型和数据结构,现在认识一个高级的:Collections 这个模块对上面的数据结构做了封装,增加 ...
- Java工程师书单(初级、中级、高级)
简介 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序员经常会问到的问题 ...
- Redis的数据结构
Redis的数据结构 redis是一种高级的key-value的存储系统,其中value支持五种数据类型. 字符串(String) 哈希(hash) 字符串列表(list) 字符串集合(set) 有序 ...
- MySQL高级02
索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构.可以得到索引的本质:索引是数据结构.你可以简单理解为“排好序的快速查找数据结构”. 在数据之外,数据库系统还维护着满足特定查找算法的 ...
随机推荐
- linux下shell命令trap
某些时候,在执行shell脚本(.sh)时,我们并不希望被打断.这时我们要用到trap命令. 例如: 在shell脚本中,忽略“终止”信号 trap ' ' TERM
- greatest common divisor
One efficient way to compute the GCD of two numbers is to use Euclid's algorithm, which states the f ...
- flash 右键菜单隐藏与修改
来源:http://blog.sina.com.cn/s/blog_7264c84401014fmd.html import flash.ui.ContextMenu;import flash.ui. ...
- 使用 Eclipse Memory Analyzer 进行简单内存泄漏分析
Java 内存泄露的根本原因: 保存了不可能再被访问的变量类型的引用.因此我们的目的就是要找出这样的引用. 1.测试代码: public class MainActivity extends Acti ...
- windowSoftInputMode键盘把输入框挡住了
android:windowSoftInputMode="stateHidden|adjustResize" >
- dos cmd重启2003命令shutdown -r -t 0
用cmd命令来关闭或重启电脑. at 2:00 /every:Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday shutdown /r ...
- sockaddr_u详解
struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; ...
- Lucene入门教程
Lucene教程 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么 ...
- HDU 4460 Friend Chains(map + spfa)
Friend Chains Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
- 平移关节(Prismatic Joint)
package{ import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.b2Body; import Box2D.Dynamics.Joints ...