文章目录

  • 1 范围查找keys()
  • 2 性能分析
  • 3 综合测试
  • 4 后记

1 范围查找keys()

既然是范围查找呢,需要遍历整个二叉树,上一篇我们讲解了二叉树遍历,这里我们就需要用到。

以中序遍历为例,范围[lo,hi][lo,hi][lo,hi]算法如下:

  • 遍历二者查找树,如果当前节点lo≤key≤hilo\le key\le hilo≤key≤hi,符合要求

代码如下:

/*** [lo,hi]范围内键的迭代器* @param lo    范围下限* @param hi    范围上限* @return      范围内键的迭代器*/
@Override
public Iterable<K> keys(K lo, K hi) {Queue<K> q = new LinkQueue<>();Stack<Node<K, V>> l = new Stack<>();Node<K, V> current = root;while (current != null || !l.isEmpty()) {while (current != null) {l.push(current);current = current.left;}if (!l.isEmpty()) {current = l.pop();if (lo.compareTo(current.key) <= 0 && hi.compareTo(current.key) >= 0) {q.offer(current.key);}current = current.right;}}return q;
}

2 性能分析

二叉查找树中和有序性有关的操作的性能如何?要研究这个问题,我们首先要知道树的高度(任意节点的最大深度或称树的深度)。给定一棵树,树的高度决定了所有操作在最坏的情况下的性能(我们实现的范围查找增长数量级N)

在一棵二叉查找树中,所有操作在最坏情况下所需的时间都和树的高度成正比。

目前位置3中符号表实现成本比较,如下表:

下面看下符号表的初始实现的性能特点,如下表4-1所示:

算法(数据结构) 最坏情况下的成本
(N次插入后)
平均情况下的成本
(N次随机插入后)
算法高效的支持有序
性相关的操作
查找 插入 查找 插入
顺序查找(无序链表) N N N/2 N
二分查找(有序数组) lgN N+lgN lgN N+lgN
二叉查找树 N N 1.39lgN 1.39lgN

3 综合测试

代码如下:

public class TestBst {public static void main(String[] args) {testBst();}public static void testBst() {BST<Integer, String> bst = new BST<>();bst.put(33, "a");bst.put(23, "b");bst.put(82, "c");bst.put(3, "d");bst.put(25, "e");bst.put(70, "f");bst.put(100, "g");System.out.println("初 始:" + bst);Integer key = 3;
//        System.out.println(key + "-" + bst.get(key));
//
//        System.out.println("最大键: " + bst.max());
//        System.out.println("最小键: " + bst.min());
//
//        key = 5;
//        System.out.println(key + " 向上取整:" + bst.ceiling(key));
//        System.out.println( key + " 向下取整:" + bst.floor(key));
//        key = 26;
//        int index = bst.rank(key);
//        System.out.println("rank(" + key + ")=" + index);
//        System.out.println("select(" + index + ")=" + bst.select(index));//        key = 70;
//        System.out.println("删除: " + key + "=" + bst.delete(key));
//        System.out.println("删除后: " + bst);//        System.out.println("删除最小键: " + bst.deleteMin());
//        System.out.println("删除后:" + bst);
//        System.out.println("删除最大键: " + bst.deleteMax());
//        System.out.println("删除后:" + bst);int lo = 0, hi = 80;Iterator<Integer> iterator = bst.keys(lo, hi).iterator();System.out.println("范围查找:" + lo + "~" + hi);while (iterator.hasNext()) {System.out.print(iterator.next() + " ");}System.out.println();}
}

我目前没测出bug,如果小伙伴有测出bug或者其他可以联系我或者留言。

4 后记

​ 如果小伙伴什么问题或者指教,欢迎交流。

❓QQ:806797785

⭐️源代码仓库地址:https://gitee.com/gaogzhen/algorithm

参考:

[1][美]Robert Sedgewich,[美]Kevin Wayne著;谢路云译.算法:第4版[M].北京:人民邮电出版社,2012.10

二叉查找树(2)-二叉树-数据结构和算法(Java)相关推荐

  1. 二叉查找树(1)-二叉树-数据结构和算法(Java)

    文章目录 1 前言 1.1 二叉查找树定义 1.2 二叉查找树的性质 2 基本实现 2.1 API 2.2 实现代码 2.2.1 数据表示 2.2.2 查找 2.2.3 插入 3 分析 4 有序性相关 ...

  2. 数据结构与算法-java笔记一 更新中

    数据结构与算法-java笔记一 更新中 数据结构与算法 什么是数据结构.算法 数据结构学了有什么用: 线性结构 数组 特点 应用 链表 存储结构 链表类型 单链表 双向链表 双向循环链表 链表与数组的 ...

  3. 数据结构和算法(Java)-张晨光-专题视频课程

    数据结构和算法(Java)-579人已学习 课程介绍         如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的 ...

  4. 视频教程-内功修炼之数据结构与算法-Java

    内功修炼之数据结构与算法 2018年以超过十倍的年业绩增长速度,从中高端IT技术在线教育行业中脱颖而出,成为在线教育领域一匹令人瞩目的黑马.咕泡学院以教学培养.职业规划为核心,旨在帮助学员提升技术技能 ...

  5. 02优先队列和索引优先队列-优先队列-数据结构和算法(Java)

    文章目录 1 概述 1.1 需求 1.2 优先队列特点 1.3 优先队列分类 1.4 应用场景 1.5 相关延伸 2 说明 3 索引优先队列 3.1 实现思路 3.2 API设计 3.2 代码实现及简 ...

  6. 数组【数据结构与算法Java】

    数组[数据结构与算法Java] 数组 数组 略

  7. 0302Prim算法-最小生成树-图-数据结构和算法(Java)

    文章目录 1 Prim算法 1.1 概述 1.1.1 算法描述 1.1.2 数据结构 1.1.3 横切边集合维护 1.2 延时实现 1.2.1 实现代码 1.2.2 性能分析 1.3 即时实现 1.3 ...

  8. 数据结构与算法Java(二)——字符串、矩阵压缩、递归、动态规划

    不定期补充.修正.更新:欢迎大家讨论和指正 本文以数据结构(C语言版)第三版 李云清 杨庆红编著为主要参考资料,用Java来实现 数据结构与算法Java(一)--线性表 数据结构与算法Java(二)- ...

  9. 数据结构和算法 java实现_数据结构与算法——常用数据结构及其Java实现

    前言 仿佛一下子,2017年就快过去一半了,研一马上就要成为过去式了,我打算抓住研一的尾巴,好好梳理一下数据结构与算法,毕竟这些基础知识是很重要的嘛.所以准备在这里搞一个系列的文章,以期透彻. 本系列 ...

最新文章

  1. 用C语言解“超速判断”题
  2. Activiti与SpringBoot的整合
  3. struts2_HelloWorld
  4. 亚马逊产品描述计算机语言编辑,亚马逊Listing产品描述编辑讲解
  5. SPIRE.DOC - .NET开发者的福利
  6. 第四节:定时器中断及定时器产生PWM(用CubeMX学习STM32)
  7. 软件工程导论面试常见问题
  8. 电子计算机与媒体阅读答案,电子计算机与多媒体课课练.docx
  9. 文件上传到ftp服务器命令,ftp上传文件到服务器命令
  10. k8s初级班day2
  11. 【保姆级!完整详细!】小米路由器3 刷openwrt固件并连接上校园网
  12. 作为 Gopher, 你知道 Go 的注释即文档应该怎么写吗
  13. 【万里征程——Windows App开发】使用Toast通知
  14. 【最大费用流】【最优匹配】丘比特的烦恼 Vijos 1169
  15. Swift - String 还是NSString
  16. 部分网站无法打开和hosts文件修改
  17. 【原】阿里云RDS数据库超大表分区实现
  18. 基于java SpringMVC的在线考试管理系统
  19. 百度沈抖:聚焦场景深耕行业,为企业数字化带来实际成效
  20. Oracle 11g安装过程出现“未找到文件”

热门文章

  1. 备份:Mac 外置显卡 / 连接方式
  2. QQ8.9精简优化安装版
  3. MySQL之——CentOS下my.cnf 配置 日志类型及文件配置详解(我本人服务器上的配置,亲测可用)
  4. mysql ndb集群
  5. 学堂在线工程伦理课后习题
  6. JavaSE核心基础
  7. 十九、新人成才之路《做人七项原则 做一个讲诚信的人》
  8. torch和torchvision对应关系
  9. genymotion无法注册解决方案
  10. 磁感应强度B与磁场强度H的区别,联系与物理意义