二叉排序树的中序遍历规律_看懂这篇文章,玩转二叉查找树
所谓二叉查找树,就是按照二分进行查找,每次查询只需要选择其中一个子树就进行查找,从而减少查找次数,提升查询效率!
一、介绍
在前面的文章中,我们对树这种数据结构做了一些基本介绍,今天我们继续来聊聊一种非常常用的动态查找树: 二叉查找树。
二叉查找树,英文全称: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的学习资料和面试试题,有需要的可以私信我获得
二叉排序树的中序遍历规律_看懂这篇文章,玩转二叉查找树相关推荐
- 看懂这篇文章,你就懂了信息安全的密码学
看懂这篇文章-你就懂了信息安全的密码学 一.前言 一个信息系统缺少不了信息安全模块,今天就带着大家全面了解并学习一下信息安全中的密码学知识,本文将会通过案例展示让你了解抽象的密码学知识,阅读本文你 ...
- 二叉排序树的中序遍历
排序二叉树的中序遍历 Problem Description 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在 ...
- python 只循环目录_看完这篇文章,你的Python基础就差不多了
世界那么大,谢谢你来看我!!关注我你就是个网络.电脑.手机小达人 前言 本文是基于黑马程序员2019年的Python基础班的内容编写的,以2019年的资料为蓝本,2018年的资料为补充,还参考了一些网 ...
- controller requestparam不传参数空指针异常_看完这篇文章,让你轻松学会Java异常处理...
一.背景 最近专门负责团队的项目质量.我在治理异常日志过程中,总结了一下Java的异常处理.上面是我整理的最近自己比较常见的异常知识地图. 二.异常知识地图概述 从异常知识地图最左边的根开始看,地图从 ...
- 电脑位数怎么看_看完了这篇文章你就知道怎么选电脑了...
电脑成为人们日常生活中.工作中不可或缺的一部分,很多朋友都不了解电脑怎么买,怎么选择才好. 选购电脑重要的几点: ①预算(千百块有千百块的电脑,三五千有三五千的电脑,七八千有七八千的电脑) ②用途(不 ...
- 苹果地图副总裁_看完这篇文章 或许你会再给“苹果地图”一次机会
地图 4 岁了. 苹果负责互联网服务和软件的高管 Eddy Cue 和 Craig Federighi,受访畅谈地图业务"得失"的机会并不多.采访实录还没看完,我抓起 iPhone ...
- 华硕x580nv拆机_看懂一篇拆机贴 拆遍天下机 华硕A45VM拆机清灰换硅脂 怒降25度!...
本帖最后由 疾影Z7 于 2017-1-11 18:06 编辑 天下龙脉尽出昆仑,同理.拆机的思路大同小异,掌握一台笔记本的拆机技巧便可拆遍天下机.拆机的诀窍是:胆大.心细.掌握好这四字诀面对市场上9 ...
- python发红包最佳手气王_看完这篇文章 以后微信抢红包手气王就是我了
春节是中华民族隆重的农历新年,这是世界上规模最大的节日. 在春节前后,炎黄子孙们不远万里衣锦还乡,与亲人们团圆. 在此期间,中国的铁路上会发生,地球上最大规模的人口迁徙. 作为世界上最能吃最能玩的种族 ...
- american主板网卡灯关机后还亮_看完这篇文章,90%的电脑黑屏问题都可以解决了!...
经常有朋友电脑一开机,发现电脑黑屏没法用了.这是什么情况?该怎么处理?很多人看到黑屏就懵了,以为电脑要报废了,别方,下面蝈蝈来给大家讲讲常见的黑屏问题的解决办法,希望对您有所帮助! 一般常说的黑屏故障 ...
最新文章
- 查看端口号被哪个程序占用
- Centos 常用系统命令
- Python:wordcloud.wordcloud()函数的参数解析及其说明
- Zookeeper在Kafka中的作用
- alter system flush shared_pool的作用 .
- ListView用法总结
- activemq 实例_在一台计算机上运行多个ActiveMQ实例
- x64 结构体系下的内存寻址
- 【Linux】统信UOS桌面壁纸右下角的统信UOS水印怎样去掉
- [Project Euler] 来做欧拉项目练习题吧: 题目012
- ORACLE异常处理及函数
- mysql left right 一张图解
- Android ContentProvider简单总结
- java web 播放器代码_各种网页播放器代码大全
- linux系统属于操作系统吗,linux属于什么操作系统
- 创建多媒体APP 之 音频播放:管理音频焦点
- 为什么没人比程序员更讨厌软件
- 聊聊被注销的TMQ公众号
- iOS积分墙和积分墙的区别在哪呢?
- Qtum量子链研究院:Qtum Plasma MVP 技术详解
热门文章
- python练习题:使用循环和函数实现一个摇骰子小游戏
- Python高效率遍历文件夹寻找重复文件
- python集合和eval的使用
- php7.2获取年份的格式,7.7.2 获取zval的值及类型
- jpa连接mysql报错_Spring boot jpa mysql 连接数据库SSL错误
- linux安装oracle出现os,linux下安装oracle
- WEB服务器和HTTP服务器和应用服务器的区别?(web服务器就是HTTP服务器)为什么要把Web服务器独立配置,和应用程序服务器一前一后?
- arm linux下nginx服务无法正常启动是什么原因?
- opencv在pycharm上没有函数提示?(需要安装opencv-contrib-python)
- 【中级软考】绑定、静态绑定、动态绑定、静态分配、动态分配是什么?