BST就是二叉检索树,或者是二叉排序树,或者叫二叉搜索树等等。

  BST的平衡问题可以去学习AVL树或者Treap或者Splay这些平衡树。

  BST的一些高级应用:

  1,求BST中比k小的数的个数:

  只需在BST上面多维护值size,表示当前这个节点的子树的点的个数。

  伪代码如下:

  1. BST tree;
  2.  
  3. int getCou(int k) {
  4. Node * u=tree.root;
  5. int ret=;
  6.  
  7. while(u!=NULL) {
  8. if(u->val<k) { // 如果当前节点值小于k,那么左子树也符合。
  9. ret+=+size(u->left);
  10. u=u->right;
  11. }
  12. else u=u->left; // 如果大于等于k的话,右子树一定不符合。
  13. }
  14.  
  15. return ret;
  16. }

  复杂度是logN的。

  2,求BST中第x小的数是几?

  仍然需要维护size数组。

  如果左子树点的个数超过x了,说明第x个在左子树,否则在右子树。

  1. BST tree;
  2.  
  3. int getXth(int x) {
  4. Node * u=tree.root;
  5.  
  6. while(u!=NULL) {
  7. if(size(u->left)<x) { // 如果左子树个数不足x,递归找右子树。
  8. x-=size(u->left)+; // 递归时在x要变化。
  9. if(x==) return u; // 找到了。
  10.  
  11. u=u->right;
  12. }
  13. else u=u->left; // 递归找左子树。
  14. }
  15.  
  16. return -;
  17. }

  复杂度logN。

  3,找到BST中正好比k大的第一个数:

  仍然是从root开始找。

  代码如下:

  1. BST tree;
  2.  
  3. int find(int k) {
  4. Node * u=tree.root;
  5. int ret=INF;
  6.  
  7. while(u!=NULL) {
  8. if(u->val>k) { // 如果当前节点大,那么他的右子树都比当前节点大,答案一定不如当前节点的值优。
  9. ret=min(ret,u->val);
  10. u=u->left;
  11. }
  12. else u=u->right; // 左子树都小,都不符合,所以找右子树去。
  13. }
  14.  
  15. return ret;
  16. }

  复杂度 logN 。

数据结构录 之 BST的高级应用。的更多相关文章

  1. 数据结构录 之 单调队列&单调栈。

    队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调 ...

  2. 数据结构录 之 单调队列&单调栈。(转)

    http://www.cnblogs.com/whywhy/p/5066306.html 队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇 ...

  3. 数据结构------------------二叉查找树(BST)的java实现

    数据结构------------------二叉查找树(BST)的java实现 二叉查找树(BST)是一种能够将链表插入的灵活性和有序数组查找的高效性相结合的一种数据结构.它的定义如下: 二叉查找树是 ...

  4. 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)

    前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...

  5. 【授课录屏】JavaScript高级(IIFE、js中的作用域、闭包、回调函数和递归等)、MySQL入门(单表查询和多表联查)、React(hooks、json-server等) 【可以收藏】

    一.JavaScript授课视频(适合有JS基础的) 1.IIFE 2.js中的作用域 3.闭包 4.表达式形式函数 5.回调函数和递归 资源地址:链接:https://pan.baidu.com/s ...

  6. Python高级数据结构-Collections模块

    在Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了之中,认识了python基本的数据类型和数据结构,现在认识一个高级的:Collections 这个模块对上面的数据结构做了封装,增加 ...

  7. Java工程师书单(初级、中级、高级)

    简介 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序员经常会问到的问题 ...

  8. Redis的数据结构

    Redis的数据结构 redis是一种高级的key-value的存储系统,其中value支持五种数据类型. 字符串(String) 哈希(hash) 字符串列表(list) 字符串集合(set) 有序 ...

  9. MySQL高级02

    索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构.可以得到索引的本质:索引是数据结构.你可以简单理解为“排好序的快速查找数据结构”. 在数据之外,数据库系统还维护着满足特定查找算法的 ...

随机推荐

  1. 缓存1 静态缓存-->读库保存成php文件 mkdir-->file_put_contents-->var_export -->include

    @mkdir()-->file_put_contents-->$data =  "<?php\nreturn ".var_export($setting, tru ...

  2. 【伪一周小结(没错我一周就做了这么点微小的工作)】HDOJ-1241 Oil Deposits 初次AC粗糙版对比代码框架重构版

    2016 11月最后一周 这一周复习了一下目前大概了解的唯一算法--深度优先搜索算法(DFS).关于各种细节的处理还是极为不熟练,根据题意判断是否还原标记也无法轻松得出结论.不得不说,距离一个准ACM ...

  3. Entity Framework 学习高级篇2—改善EF代码的方法(下)

    ,IQueryable<Customers>>( (database) => database.Customers.Where(c => c.City == " ...

  4. mysql 中tinytext、text、mediumtext和longtext详解

    一.数字类型 类型 范围 说明   Char(N) [ binary] N=1~255 个字元binary :分辨大小写 固定长度 std_name cahr(32) not null VarChar ...

  5. c++11 右值引用、move、完美转发forward<T>

    #include <iostream> #include <string> using namespace std; template <typename T> v ...

  6. How to Iterate Over a Map in Java?(如何遍历Map)

    1.Iterate through the "entrySet" like so: public static void printMap(Map mp) { Iterator i ...

  7. POJ 1067 取石子游戏 威佐夫博弈

    威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 我们用(ak,bk)(ak ≤ bk ,k= ...

  8. apicloud本地测试安卓测试包安装

    1.liutingdeMacBook-Pro:~ js-lt$ which adb 2.liutingdeMacBook-Pro:~ js-lt$ ls 3.liutingdeMacBook-Pro: ...

  9. phpstudy 安装memcached服务和memcache扩展

    memcached安装步骤: 首先,将下载好的memcahed解压到某个文件目录下,例如 C:\memcached 然后,在cmd里,输入"C:\memcached\memcached.ex ...

  10. 最短路径问题/Spfa

    题目链接 题目描述 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线, 则输出花费最少的. 最后一行是两个数 s,t;起 ...