【数据结构】什么是二叉搜索(排序)树?

news/2024/9/20 23:20:56/

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


目录

📌二叉搜索(排序)的概念

📌二叉搜索(排序)的操作

🎏>二叉搜索的查找

🎏>二叉搜索的插入

🎏>二叉搜索的删除

结语


📌二叉搜索(排序)的概念

        我们今天要介绍的是一种非常适合于搜索/排序的, 当然二叉搜索(排序)的前提是它是一颗,并且是一颗>二叉。因此对于以及>二叉的定义还有不太了解的朋友建议先移步这两篇博客补充一下数据结构的相关前置知识:

数据结构】什么是?icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_72357342/article/details/134973723?spm=1001.2014.3001.5502

数据结构】什么是>二叉?icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_72357342/article/details/135162895?sharetype=blogdetail&sharerId=135162895&sharerefer=PC&sharesource=weixin_72357342&spm=1011.2480.3001.8118

        >二叉搜索(BST, Binary Search Tree) 也称二叉排序或二叉查找。它或是一颗空,或是具有下列性质的>二叉:

  • 若它的左子不为空,则左子上所有结点的值均小于它的根节点的值。
  • 若它的右子不为空,则右子上所有结点的值均大于它的根节点的值。
  • 它的左右子也分别为>二叉搜索

        下图罗列了部分属于/不属于>二叉搜索>二叉以供参考:

        对于>二叉搜索而言,其中序遍历的结果恰好是中所有结点值的有序排列,因此特性也称其为二叉排序。构造一棵二叉排序的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。不管怎么说,在一个有序数据集上的查找,速度总是要快于无序的数据集的,而二叉排序这种非线性的结构,同样有利于插入和删除操作的实现


📌二叉搜索(排序)的操作

        以如下>二叉搜索为例, 分别剖析>二叉搜索的查找,插入和删除操作:

int a[] = { 8, 3, 1, 10, 6, 4, 7, 14, 13 };

🎏>二叉搜索的查找

        >二叉搜索的查找过程如下:

  1. 从根节点开始比较查找, 如果查找值比根结点值大,则往右子继续查找; 如果查找值比根结点值小,则往左子继续查找;
  2. 最多查找高度次, 即查找到叶子节点, 如果还没找到, 则该值不存在于此中。

🎏>二叉搜索的插入

        >二叉搜索的插入过程如下:

  1. 为空,则直接新增节点,赋值给根节点指针
  2. 不为空,则按>二叉搜索性质查找插入位置, 在查找到为空的位置插入新增值, 如果查找到该值已存在, 则返回查找失败(>二叉搜索不允许插入重复值)

🎏>二叉搜索的删除

        查找元素是否在二叉搜索中,如果不存在,则返回,如果存在,则待删除结点可能存在以下四种情况:

  1. 待删除结点无孩子结点
  2. 待删除结点只有左孩子结点(不管右孩子)
  3. 待删除结点只有右孩子结点(不管左孩子)
  4. 待删除结点左,右孩子结点都有

        在实际删除操作中,可以将1和2 / 3合并起来,因为我们的逻辑是哪边有孩子就管理,没有孩子就可以不管,因此无孩子结点既可以和不管右孩子结点情况合并又可以和不管左孩子情况合并,合并后实际的删除情况及过程如下三种:

  1. 删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点--直接删除
  2. 删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点--直接删除
  3. 在它的右子中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题--替换法删除


结语

希望这篇关于 二叉搜索(排序) 的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

数据结构】什么是线性表?

数据结构】线性表的链式存储结构

数据结构】什么是栈?

数据结构】什么是?

数据结构】什么是队列?

数据结构】什么是堆?

数据结构】什么是?

数据结构】什么是>二叉?



http://www.ppmy.cn/news/1528123.html

相关文章

MYSQL面试知识点手册

第一部分:MySQL 基础知识 1.1 MySQL 简介 MySQL 是世界上最流行的开源关系型数据库管理系统之一,它以性能卓越、稳定可靠和易用性而闻名。MySQL 主要应用在 Web 开发、大型互联网公司、企业级应用等场景,且广泛用于构建高并发、高可用的数据…

SDL 2.0视频数据渲染到窗口上播放流程

在 SDL 2.0 中,将视频数据渲染到窗口上涉及几个步骤,包括创建窗口和渲染器、加载视频帧数据、将其绘制到纹理上以及更新显示。以下是一个基本的示例,演示了如何使用 SDL 2.0 渲染视频帧到窗口: 基本步骤 初始化 SDL:…

【结构型】树形结构的应用王者,组合模式

目录 一、组合模式1、组合模式是什么?2、组合模式的主要参与者: 二、优化案例:文件系统1、不使用组合模式2、通过组合模式优化上面代码优化点: 三、使用组合模式有哪些优势1、统一接口,简化客户端代码2、递归结构处理方…

【大模型入门】零基础入门AI大模型应用开发,你需要一个系统的入门路径!

随着大模型技术的飞速发展,我们正站在一个全新的技术前沿,探索着如何将这些强大的工具应用于实际问题的解决。如果你对AI大模型应用开发充满热情,那么你可以读一下这篇文章——一个系统全面的入门指南,专为渴望深入AI世界的你设计…

贪心算法day31|56. 合并区间、738. 单调递增的数字(整数与字符串的转换)、贪心刷题总结

贪心算法day31|56. 合并区间、738. 单调递增的数字、贪心刷题总结 56. 合并区间738. 单调递增的数字贪心刷题总结 56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 …

ffmpeg实现视频的合成与分割

视频合成与分割程序使用 作者开发了一款软件,可以实现对视频的合成和分割,界面如下: 播放时,可以选择多个视频源;在选中“保存视频”情况下,会将多个视频源合成一个视频。如果只取一个视频源中一段视频…

python + ssh+ rich 升级和备份脚本

升级版本 (根据AI提供的脚本,修改后) import os import paramiko from scp import SCPClient from rich.progress import (BarColumn,DownloadColumn,Progress,TaskID,TextColumn,TimeRemainingColumn,TransferSpeedColumn, )def get_file_size(file_pat…

实战案例(5)防火墙通过跨三层MAC识别功能控制三层核心下面的终端

如果网关是在核心设备上面,还能用MAC地址进行控制吗? 办公区域的网段都在三层上面,防火墙还能基于MAC来控制吗? 采用正常配置模式的步骤与思路 (1)配置思路与上面一样 (2)与上面区…