所谓二叉查找树,就是按照二分进行查找,每次查询只需要选择其中一个子树就进行查找,从而减少查找次数,提升查询效率!

一、介绍

在前面的文章中,我们对树这种数据结构做了一些基本介绍,今天我们继续来聊聊一种非常常用的动态查找树: 二叉查找树。

二叉查找树,英文全称:Binary Search Tree,简称:BST,它是计算机科学中最早投入实际使用的一种树形结构,特性如下:

  • 若左子树不为空,则左子树上所有结点的值均小于它的根结点的值;
  • 若右子树不为空,则右子树上所有结点的值均大于或等于它的根结点的值;
  • 它的左、右子树也分别为二叉查找树;

特性定义比较粗放,所以在树形形态结构上,有着多样,例如下图:

上图 a、b、c 三个图,都满足以上特性,也被称为二叉查找树,虽然通过中序遍历可以得到一个有效的数组:[1、2、3、4、5、6、7、8],但是就查找效率来说,有着一定的差别,例如查询目标为8的内容,从根目录开始查询,结构如下:

  • a图,需要5次;
  • b图,需要3次;
  • c图,需要8次;

由此可见,不同的形状,所需查找的次数是不一样的,关于这一点,后面我们在介绍平衡二叉查找树、红黑树这种数据结构的时候,会进行详细介绍。

虽然二叉查找树,在不同的形状下,查找效率不一样,但是它是学习其他树形结构的基础,了解了二叉查找树的算法,相信再了解其他二叉树结构会轻松很多。

二、算法思路

2.1、 新增

新增元素表示向二叉树中添加元素,比较简单。如果二叉树为空,默认第一个元素就是根节点,如果二叉树不为空,就以上面提到的特点为判断条件,进行左、右节点的添加。

2.2、 查找

查找元素表示从根节点开始查找元素,如果根节点为空,就直接返回空值,如果不为空,通过以左子树小于父节点,右子树大于父节点的特性为依据进行判断,然后以递归方式进行查找元素,直到找到目标的元素为止。

2.3、 删除

删除元素表示从二叉树中移除要删除的元素,逻辑稍微复杂一些。同样,先要判断根节点是否为空,如果为空,直接返回,如果不为空,分情况考虑。

被删除的节点,右子树为空

这种场景,只需要将被删除元素的左子树的父节点移动到被删除元素的父节点,然后将被删除元素移除即可。

  • 被删除的节点,左子树为空

这种场景,与上面类似,只需要将被删除元素的右子树的父节点移动到被删除元素的父节点,然后将被删除元素移除即可。

  • 被删除的节点,左、右子树不为空

这种场景,稍微复杂一点,先定位到要删除的目标元素,根据左子节点内容一定小于当前节点内容特点,找到目标元素的左子树,通过递归遍历找到目标元素的左子树的右子树,找到最末端的元素之后,进行与目标元素进行替换,最后移除最末端元素。

2.4、 遍历

二叉树的遍历方式,分两类:

  • 层次遍历,从根节点开始;
  • 深度遍历,又分为前序、中序、后序遍历三种方式;

2.4.1、层次遍历

层次遍历,算法思路比较简单,从根节点开始,分层从左到右进行遍历元素。

2.4.2、深度遍历

深度遍历,在遍历起始位置上又分三种,分别是前序遍历、中序遍历、后序遍历,每种遍历方式输出的结果不一样。

  • 前序遍历:从树根开始 -> 左子树 -> 右子树
  • 中序遍历:从最末端左子树开始 -> 树根 -> 右子树
  • 后序遍历:从最末端左子树 -> 右子树 -> 最后到树根

尽管二叉树在遍历方式上有多种,但是只要我们掌握了其中的思路原理,再去实现起来,就会轻松很多。

三、代码实践

首先创建一个实体数据结构BSTNode,内容如下:

然后,创建一个二叉查找树操作类BinarySearchTree,内容如下:

最后,我们来测试一下,代码内容如下:

输出结果:

========插入元素========

插入关键字key=5

插入到树根节

插入关键字key=2

插入关键字key=7

插入关键字key=1

插入关键字key=6

插入关键字key=4

插入关键字key=8

插入关键字key=3

插入关键字key=9

插入关键字key=10

========中序遍历元素========

key:1

key:2

key:3

key:4

key:5

key:6

key:7

key:8

key:9

key:10

========查找key为9的元素========

搜索关键字key=9

搜索路径[5 ->7 ->8 ->9 ->],搜索成功

查找结果:true

========删除key为10的元素========

删除关键字key=10

开始搜索目标元素[5 ->7 ->8 ->9 ->10 ->],搜索成功

删除结果:true

========再次中序遍历元素========

key:1

key:2

key:3

key:4

key:5

key:6

key:7

key:8

key:9

四、总结

二叉查找树,作为树类型中一种非常重要的数据结构,有着非常广泛的应用,但是二叉查找树具有很高的灵活性,不同的插入顺序,可能造成树的形态差异比较大,如开文介绍的图c,在某些情况下会变成一个长链表,此时的查询效率会大大降低,如何解决这个问题呢,平衡二叉树就要派上用场了。我有很多Java的学习资料和面试试题,有需要的可以私信我获得

二叉排序树的中序遍历规律_看懂这篇文章,玩转二叉查找树相关推荐

  1. 看懂这篇文章,你就懂了信息安全的密码学

    看懂这篇文章-你就懂了信息安全的密码学 一.前言 ​ 一个信息系统缺少不了信息安全模块,今天就带着大家全面了解并学习一下信息安全中的密码学知识,本文将会通过案例展示让你了解抽象的密码学知识,阅读本文你 ...

  2. 二叉排序树的中序遍历

    排序二叉树的中序遍历 Problem Description 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在 ...

  3. python 只循环目录_看完这篇文章,你的Python基础就差不多了

    世界那么大,谢谢你来看我!!关注我你就是个网络.电脑.手机小达人 前言 本文是基于黑马程序员2019年的Python基础班的内容编写的,以2019年的资料为蓝本,2018年的资料为补充,还参考了一些网 ...

  4. controller requestparam不传参数空指针异常_看完这篇文章,让你轻松学会Java异常处理...

    一.背景 最近专门负责团队的项目质量.我在治理异常日志过程中,总结了一下Java的异常处理.上面是我整理的最近自己比较常见的异常知识地图. 二.异常知识地图概述 从异常知识地图最左边的根开始看,地图从 ...

  5. 电脑位数怎么看_看完了这篇文章你就知道怎么选电脑了...

    电脑成为人们日常生活中.工作中不可或缺的一部分,很多朋友都不了解电脑怎么买,怎么选择才好. 选购电脑重要的几点: ①预算(千百块有千百块的电脑,三五千有三五千的电脑,七八千有七八千的电脑) ②用途(不 ...

  6. 苹果地图副总裁_看完这篇文章 或许你会再给“苹果地图”一次机会

    地图 4 岁了. 苹果负责互联网服务和软件的高管 Eddy Cue 和 Craig Federighi,受访畅谈地图业务"得失"的机会并不多.采访实录还没看完,我抓起 iPhone ...

  7. 华硕x580nv拆机_看懂一篇拆机贴 拆遍天下机 华硕A45VM拆机清灰换硅脂 怒降25度!...

    本帖最后由 疾影Z7 于 2017-1-11 18:06 编辑 天下龙脉尽出昆仑,同理.拆机的思路大同小异,掌握一台笔记本的拆机技巧便可拆遍天下机.拆机的诀窍是:胆大.心细.掌握好这四字诀面对市场上9 ...

  8. python发红包最佳手气王_看完这篇文章 以后微信抢红包手气王就是我了

    春节是中华民族隆重的农历新年,这是世界上规模最大的节日. 在春节前后,炎黄子孙们不远万里衣锦还乡,与亲人们团圆. 在此期间,中国的铁路上会发生,地球上最大规模的人口迁徙. 作为世界上最能吃最能玩的种族 ...

  9. american主板网卡灯关机后还亮_看完这篇文章,90%的电脑黑屏问题都可以解决了!...

    经常有朋友电脑一开机,发现电脑黑屏没法用了.这是什么情况?该怎么处理?很多人看到黑屏就懵了,以为电脑要报废了,别方,下面蝈蝈来给大家讲讲常见的黑屏问题的解决办法,希望对您有所帮助! 一般常说的黑屏故障 ...

最新文章

  1. 查看端口号被哪个程序占用
  2. Centos 常用系统命令
  3. Python:wordcloud.wordcloud()函数的参数解析及其说明
  4. Zookeeper在Kafka中的作用
  5. alter system flush shared_pool的作用 .
  6. ListView用法总结
  7. activemq 实例_在一台计算机上运行多个ActiveMQ实例
  8. x64 结构体系下的内存寻址
  9. 【Linux】统信UOS桌面壁纸右下角的统信UOS水印怎样去掉
  10. [Project Euler] 来做欧拉项目练习题吧: 题目012
  11. ORACLE异常处理及函数
  12. mysql left right 一张图解
  13. Android ContentProvider简单总结
  14. java web 播放器代码_各种网页播放器代码大全
  15. linux系统属于操作系统吗,linux属于什么操作系统
  16. 创建多媒体APP 之 音频播放:管理音频焦点
  17. 为什么没人比程序员更讨厌软件
  18. 聊聊被注销的TMQ公众号
  19. iOS积分墙和积分墙的区别在哪呢?
  20. Qtum量子链研究院:Qtum Plasma MVP 技术详解

热门文章

  1. python练习题:使用循环和函数实现一个摇骰子小游戏
  2. Python高效率遍历文件夹寻找重复文件
  3. python集合和eval的使用
  4. php7.2获取年份的格式,7.7.2 获取zval的值及类型
  5. jpa连接mysql报错_Spring boot jpa mysql 连接数据库SSL错误
  6. linux安装oracle出现os,linux下安装oracle
  7. WEB服务器和HTTP服务器和应用服务器的区别?(web服务器就是HTTP服务器)为什么要把Web服务器独立配置,和应用程序服务器一前一后?
  8. arm linux下nginx服务无法正常启动是什么原因?
  9. opencv在pycharm上没有函数提示?(需要安装opencv-contrib-python)
  10. 【中级软考】绑定、静态绑定、动态绑定、静态分配、动态分配是什么?