Java集合源码分析之基础(四):二叉排序树

二叉查找树实现源码(C、C++、JAVA) 立即下载

解决查询速度慢的方案除了哈希表外,还可以使用二叉排序树。我们知道,查询慢主要是因为不知道元素的位置,使用hash函数映射虽然解决了问题,但其并不稳定,当出现大量的哈希碰撞后其表现更像一个链表,查询速度大大降低。

二叉排序树的方案则是使元素有序,这样便可以使用二分法进行查找了,虽然效率相比hash函数低一些,但可以通过AVL树、红黑树等增加稳定性。

HashMap在JDK1.8的实现中,就结合了哈希表的高效和红黑树的稳定,我们之后会详细分析其实现。

定义

二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值

  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值

  • 它的左、右子树也分别为二叉排序树

如下就是一棵简单的二叉排序树:

 

二叉排序树示意图

当对这棵树进行中序遍历时,其结果将按照从小到大排序。

查询操作

二叉排序树的查找时间复杂度为O(lg n),查找使用二分法。要在上图中找到元素37,只需要四次操作即可。

首先,找到根元素22,37比22大,所以淘汰左子树,再找到35,淘汰左子树,再找到41,进入左子树,得到37。可以看到其速度比挨个对比高了很多。

插入操作

二叉排序树的插入操作和查询类似,也需要通过二分法进行查找,找到合适的位置再插入元素,所以其插入速度相比链表较慢。

删除操作

从二叉排序树中删除一个元素主要分为三种情况。

例如要从下面这个二叉排序树中删除一个元素:

二叉排序树

  1. 删除的元素是叶结点,这时可以直接删除它。比如要删除值为1的元素,删除它对树没有任何影响。

  2. 删除的元素仅有左孩子或者仅有右孩子时,直接让其孩子顶替它即可。比如要删除元素35,只需要用41顶替它即可。

  3. 删除的元素既有左孩子又有右孩子,这时删除它相对复杂。一种好的方式是找到它的前驱或者后继来代替它。比如要删除元素9,就用6或者13代替它即可。

问题

一棵普通的二叉排序树也会出现不平衡问题,如果插入的数据都在树的一侧,就会使得树的深度迅速增大,每次二分查找可以排除的数据很少,从而查询速度严重下降,比如下方这棵树:

不平衡的排序树

要查找值为2的元素,使用二分法和使用链表速度差不多。

为了解决这种问题,就需要在元素插入时即进行修正,后续介绍的AVL树和红黑树就是两种不同的解决方案。

如果喜欢我的文章,可以关注我哦!

常见卫星图源下载教程 上面列出的8个常见的亚米级别数据源都可以通过xyz协议或者wmts/wms协议进行下载。这些协议是什么?地理信息数据为了方便网络传输,制定了一系列的地理数据传输标准(wms/wmts/xyz等)。协议特点优点缺点栅格数据支持矢量数据支持WMS通过HTTP请求获取GIS数据,服务器会将数据渲染成图像高度定制的地图;交互性强服务器渲染图像,响应时间较长支持有限支持WMTS提供预渲染的地图瓦片速度快,因为地图瓦片可以预先生成并在请求时快速提供瓦片的内容是预先确定的,无法进行定制支持。 阅读详情

相关推荐

华为交换机与思科/华三设备LACP对接实战:手把手教你配置链路聚合

本文详细解析了华为交换机与思科、华三设备间的LACP链路聚合配置实战,涵盖核心原理、配置步骤及排错技巧。通过对比不同厂商的实现差异,提供可落地的跨厂商对接方案,助力企业网络工程师高效部署高可靠性链路聚合。

weixin_30836759的博客 422

二叉排序树(Java实现)

文章收藏的好句子:坚持和放纵是永远对立的矛盾,好习惯的坚持就像春天随手丢下的种子,经历漫长的仲夏,终将会迎来收获的金秋。而坏习惯的养成真的只能让人生的脚步停止在寒风凛冽的冬天,让你永远看不见下一个春天。目录1、数列的查询和添加问题2、二叉排序树 2、1二叉排序树的介绍 2、2二叉排序树的创建和遍历 2、3二叉排序树的删除1、数列的查询和添加...

qq_37837621的博客 2445

APS项目大都失败告终?

通过上述分析,APS从二十多年前的流行到如今的实施困境,背后涉及企业自身、供应商、项目管理等原因,既有理论发展的复杂性增加的原因,也有企业对APS期望值过高和误解的因素。APS(Advanced Planning and Scheduling)高级排程系统是一种高度智能化的计划和排程系统,它通过整合各种生产和供应链数据,运用先进的算法和数据模型,根据各种约束条件,如资源限制、交货期、生产能力等,以最优的方式规划和调度生产活动,从而为生产计划提供最优解决方案。高级管理层的支持对于APS项目的成功至关重要。

数字化藏经阁 1343

二叉排序树代码实现(java版)

一、定义 1、一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的结点。 二、基础代码 1、先定义一个节点类,包括左节点、右节点、值三个实例变量。 public class Node { priv...

jiankang66的博客 2209

c语言版数据结构课程设计 学生成绩管理系统

此学生成绩管理系统完成15项功能,是我经过很多次的修改得到的。花费时间不短,功能齐全,主要完成了:输入,输出,插入,修改,删除,查询,读取文件,写入文件,复制文件,建立索引,显示各种情况下的信息,追加学生信息等等功能。一共15项。   代码如下: // shujujiegou.cpp : 定义控制台应用程序的入口点。///**本程序采用数组链表形式,原因:数组查询速度快,数组也能实现动态存储

Java 1万+

YOLOv8改进 - 注意力篇 - 引入CAA注意力机制

YOLOv8改进 - 注意力篇 - 引入CAA注意力机制

浪子L的博客 5223

Java实现二叉排序树

package dataStruct.二叉排序树; public class 二叉排序树 { public static void main(String[] args) { Tree tree = new Tree(); int[] arr = {7,3,10,12,5,1,9,0}; for (int i = 0; i <arr.length ; i++) { //循环创建对象 tree.a.

qq_52655865的博客 555

VHDL按键消抖(状态机版本)

检测下降沿:设置一个和,分别代表之前的之前和之前的信号状态,若两个信号key_in_d2=1,key_in_d1=0,他俩的not key_in_d2 and key_in_d1为1,则说明下降沿产生,把它设置为标志位key_flag。延时计数:50MHz的板子每次计数需要20ns,而抖动时间大约为5-10ms。所以取7ms,作为延时时间。可以看见当检测到下降沿时,开始计数计数计满再次检测,若为低电平则为按下按键,否则为抖动。通过检测下降沿来临,延时计数再次检测,如果为低电平则为按键按下。

qq_69639216的博客 1083

java实现排序二叉树

java实现一个排序树: (1)每个节点:用一个类表示(父节点,左子节点,右子节点,自身,父节点对象,左右节点对象存储其地址) (2)整体结构:用一个集合<Integer>表示 (3)初始化:空(约束条件:第一个添加的元素必须是根节点,无父节点,左右节点分别置为空,自身赋值) (4)插入方法:使用查询指针进行移动,首先设置为根节点,如果大于该节点则将指针移动到根节点的右子树,否则创建右子树并赋值,左子树同理 Tree节点: package TreeArrayList; impor

weixin_42439479的博客 811

【GEE数据库】WRF常用数据集总结

【GEE数据库】WRF常用数据集总结

WW、forever的博客 633

ModuleNotFoundError: No module named‘langchain.schema.output parserlangchain.schema is not a package

电脑里现有的langchain库版本与import所需的不同,卸载原有langchain,重新下载最新的langchain。在步骤1后,若仍不可运行。在确保已重新下载新langchain后,重启python后,可正常运行。在版本号中填入所需的langchain版本号,可在requirements.txt查看。运行如下代码时,出现error。

weixin_45751925的博客 1713

java二叉排序树(含java代码详解)

二叉排序树的原理解释与详细代码解释

qq_56127002的博客 1290

【工具篇】万字长文拆解 Otter.ai:语音转文字领域的「瑞士军刀」是如何炼成的?(附保姆级教程)

但需要注意,2024年欧盟已出台《AI转录伦理指南》,要求所有录音需获得参与者明确授权。举个真实案例:某硅谷创业团队用Otter.ai记录产品评审会,系统自动标红争议点并生成待办事项,会议效率提升40%。AIGC技术原理、 实时转录解析、 定价策略分析、 语音算法拆解、 多平台兼容测试、 深度学习框架、 空间计算专利。——无论是跨国会议、课堂讲座还是深夜灵感,它都能实时生成带时间戳的文本记录,准确率高达95%。(此处建议插入Otter.ai会议转录动图,展示实时字幕生成效果)(数据来源:综合参考文献整理)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1258

java 二叉排序_Java集合源码分析之基础(四):二叉排序树

解决查询速度慢的方案除了哈希表外,还可以使用二叉排序树。我们知道,查询慢主要是因为不知道元素的位置,使用hash函数映射虽然解决了问题,但其并不稳定,当出现大量的哈希碰撞后其表现更像一个链表,查询速度大大降低。二叉排序树的方案则是使元素有序,这样便可以使用二分法进行查找了,虽然效率相比hash函数低一些,但可以通过AVL树、红黑树等增加稳定性。HashMap在JDK1.8的实现中,就结合了哈希表的...

weixin_28958485的博客 103

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java集合源码分析(四):二叉排序树

解决查询速度慢的方案除了哈希表外,还可以使用二叉排序树。我们知道,查询慢主要是因为不知道元素的位置,使用hash函数映射虽然解决了问题,但其并不稳定,当出现大量的哈希碰撞后其表现更像一个链表,查询速度大大降低。 二叉排序树的方案则是使元素有序,这样便可以使用二分法进行查找了,虽然效率相比hash函数低一些,但可以通过AVL树、红黑树等增加稳定性。 HashMap在JDK1.8的实现中,就结合了哈希表的高效和红黑树的稳定,我们之后会详细分析其实现。 一、二叉排序树的定义 二叉排序树 又称为二叉搜索树,它可以是

不会编程的派大星的博客 233

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

treemap怎么保证有序_Java集合框架—TreeMap—源码研读

前言:在上一篇文章:Java集合框架—LinkedHashMap—源码研读 中,我们深入学习了LinkedHashMap,现在,让我们开始学习更进阶一点的内容——TreeMap。学习TreeMap前,最好需要先了解一下比较器Comparat、二叉排序树、红黑树据结构的知识。所以此篇文章,分为3个部分:1.比较器Comparator和Comparable接口2.红黑树和二叉排序树3.红黑树的左旋和右...

weixin_39848007的博客 766

Java集合系列之TreeMap源码分析

一、概述   TreeMap是基于红黑树实现的。由于TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射根据其键的自然顺序进行排序或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。另外TreeMap中不允许键对象是null。   1、什么是红黑树?   红黑树是一种特殊的二叉排序树,主要有以下几条基本性

1123

java集合图解源码系列【2】:从二叉树讲到TreeMap,一篇搞明白树的数据结构

大家好!我是未来村村长,就是那个“请你跟我这样做,我就跟你这样做!”的村长👨‍🌾!

农夫的码,没有草原 2015

Java集合之TreeMap源码分析

一、概述   TreeMap是基于红黑树实现的。由于TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射根据其键的自然顺序进行排序或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。另外TreeMap中不允许键对象是null。   1、什么是红黑树?   红黑树是一种特殊的二叉排序树,主要有以下几条基本性质...

dengduoya4019的博客 91

Java集合源码分析之开篇

初衷 Java集合是我们使用最频繁的工具,也是面试的热点,但我们对它的理解仅限于使用上,而且大多数情况没有考虑过其使用规范。本系列文章将跟随源码的思路,分析实现的每个细节,以期在使用时避免各种不规范的坑。在这里,我们会惊艳于开发者优秀的设计,也会感激先辈们付出的艰辛努力,更重要的是知其所以然,少犯错误,写出优秀的代码。 许多人对集合类的理解是暴力的,当需要保存对象时就使用ArrayList,当...

qq_39409110的博客 163

Java 源码分析(一)集合

Java 集合 包括 list,map,set 集合 集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用。 注:数组我在前面的博客讲了大家可以看下 集合中接口和类的关系 Collection接口是集合类的根接口,Java中没有提供这个接口的直接的...

兴浩的博客 206

Java集合源码分析之基础(三):树与二叉树

数组和链表都是用来解决一对一问题的,而一对多问题则需要树来解决。这里,我们重点关注二叉排序树,所以只会介绍一些必需了解的概念,关于树的更多知识,大家可以查看相关书籍进行系统的学习。 树的定义 树(Tree)是n(n≥0) 个结点的有限集。n=0 时称为空树。在任意一棵非空树中: 1. 有且仅有一个特定的称为根(Root)的结点; 2. 当n>1 时,其余结点可分为m (m>0) 个...

刀哥谈Java的博客 674

Java集合类源码分析(八):Map接口之TreeMap实现类

Java集合类源码分析(八):Map接口之TreeMap实现类

MyKelly_2013 312
上一篇: Java集合源码分析之基础(三):树与二叉树
下一篇: Java集合源码分析之基础(五):平衡二叉树(AVL Tree)
刀哥谈Java
博客等级 码龄8年 110粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值