看懂这篇文章,玩转二叉查找树

简介: 大家好,我是鸭血粉丝,拼着头发掉光的风险给大家总结了这篇文章,我愿拿我明年的今天还是单身来祝愿你们能学会~所谓二叉查找树,就是按照二分进行查找,每次查询只需要选择其中一个子树就进行查找,从而减少查找次数,提升查询效率!

一、介绍

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

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

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

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

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

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

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

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

二、算法思路

2.1、 新增

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

2.3、 查找

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

90.jpg

2.2、 删除

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

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

91.jpg

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

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

92.jpg

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

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

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

2.4、 遍历

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

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

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

94.jpg


2.4.2、深度遍历

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

  • 前序遍历:从树根开始 -> 左子树 -> 右子树

95.jpg

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

96.jpg

后序遍历:从最末端左子树 -> 右子树 -> 最后到树根

97.jpg

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

三、代码实践

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

98.jpg

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

99.jpg

100.jpg101.jpg

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

103.jpg

104.jpg

结果

========插入元素========
插入关键字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
Java数据结构与算法分析(八)二叉查找树(BST)
二叉查找树又叫二叉排序树(Binary Sort Tree),或叫二叉搜索树,简称BST。BST是一种节点值之间有次序的二叉树。
84 0
二叉查找树的认识
二叉查找树的认识
二叉查找树的认识
|
存储 Java
Java实现二叉平衡搜索树
平衡二叉查搜索树:简称平衡二叉树。由前苏联的数学家 Adelse-Velskil 和 Landis 在 1962 年提出的高度平衡的二叉树,根据科学家的英文名也称为 AVL 树。
127 0
Java实现二叉平衡搜索树
|
存储 算法
【数据结构与算法分析】0基础带你学数据结构与算法分析08--二叉查找树 (BST)
假设树上每个结点都存储了一项数据,如果这些数据是杂乱无章的插入树中,那查找这些数据时并不容易,需要 O(N) 的时间复杂度来遍历每个结点搜索数据。
123 0
【数据结构与算法分析】0基础带你学数据结构与算法分析08--二叉查找树 (BST)
|
存储 缓存 算法
从二叉查找树到B*树,一文搞懂搜索树的演进!
本文从二分查找讲起,讲解了BST、AVL、红黑树、B树、B+树最后到B*树的演进过程,知其所以然!
从二叉查找树到B*树,一文搞懂搜索树的演进!
|
算法 C语言
Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现
Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现
Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现
|
C++
有关AVL树的总结与感悟
一开始以为很复杂很可怕,后来自己想了一下其实也没那么可怕,无非就是左右子树的顺序调换而已。 有关AVL的旋转的原理就不再说明,不懂自行百度查书了解旋转原理。
115 0
|
Java 索引
二叉查找树 Java实现
二叉查找树 Java实现定义:一棵二叉查找树是一棵二叉树,每个节点都含有一个Comparable的键(以及对应的值)。每个节点的键都大于左子树中任意节点的键而小于右子树中任意节点的键。 image 树的术语: Name Function路径 顺着连接点的边从一个节点走向另一个节点,所经过的节点的顺序排列就称为路径。
1450 0
|
存储 索引 容器
图与二叉查找树
图的存储方式 1、邻接矩阵(二维数组) //邻接矩阵构建图 #include "stdafx.h" #include #include using namespace std; void Creat_graph(...
950 0
|
算法
算法学习之路|二叉查找树
从二叉树开始慢慢理解红黑树
1355 0