二叉搜索树(BST)简单讲解

news2024/11/18 0:27:37

概念:

二叉搜索树是一棵二叉树或者空树,又名二叉排序树,英文简写为 BST (Binary Search Tree)

性质:

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

它的性质使得它中序遍历这棵树一定会得到有序序列

存储底层:

链式存储

性能:

插入和删除操作都必须先查找,所以查找效率代表了二叉搜索树中各个操作的性能。

二叉搜索树的对于一个数据的查找次数为树的高度。

最优情况下:二叉搜索树为完全二叉树或接近完全二叉树时,平均效率为:O(logn)

最差情况下:二叉搜索树退化为单支树(或者类似单支),其平均效率为:O(n)

因为是链式存储,所以增删效率在最优情况下是很客观的,但在最坏情况下却不行,所以二叉搜索树的进阶:AVL树和红黑树便对其进行了优化,解决了退化的情况。

使用:

搜索二叉树的作用并不广泛,但它作为 AVL树 和 红黑树 的基础是必不可少的。

我们可以简单理解一下它的增删查改等操作。

查找:

比当前根节点大往右树走,小就往左树走,然后对这棵子树进行一样的操作,相等就找到,最后走到空节点还未走到就是不存在(注意,若有相同值的节点,这样找到的节点会是最左边的那个,因为中序遍历下最左是第一个)

增加:

先进行和查找一样的动作,插入值比当前根节点大就往右树走,小就往左树走,相同往左往右都可,为空就插入

例:

插入一个5,小于8左走,大于3右走,小于6左走,大于4右走,最后值为4的节点没有右节点,它的右节点为空,就插入那个位置,结果如下:

删除:

先进行查找,将这个要删除的值替换为 其左子树的最大值或其右子树的最小值,最后删除这个左子树的最大值或右子树的最小值即可。

因为二叉搜索树的特性,它的最大值在树的最右侧,最小值在树的最左侧,所以必定是叶子节点,可以直接删除。

例:

删除值为3的节点,并且我们用它右子树的最小值代替,结果如下:

 对此可以用个比喻来解释:因为二叉搜索树用中序遍历那么得到的就是有序数列,如上图例子得到的序列就是:

1   3   4   6   7   8   10   13   14

然后我们删除了3,要么 3 原本的位置要么是它右边序列左移,最后也就是 4 覆盖了3的位置,要么左边序列右移,最后也就是 1 覆盖了原来的位置。这就是为什么要用左树的最大值或右树的最小值代替删除值。

完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2200630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用C++写一个自己定义的图像格式,写入磁盘

看到OpenCV的Image类实例一副图像,觉得挺好玩,因此想自己定义一个自己的图像类,让后完成写盘,并且读取出来。没有办法,再利用一下OpenCV的imshow显示一下,看看和自己的预期是否一样。 首先要先定义一个图像…

养猫家庭有什么宠物空气净化器推荐吗?哪款吸毛效果最好?

不知道你们家的猫最近有没有大量掉毛?还是今早穿短袖感觉到有点冷,我才意识到秋天到了,新一轮的换毛季又来了。不仅和猫咪玩耍的时候可以“采摘”不少毛毛,而且家里的衣服上、地板上也被毛发入侵,感觉用不了多久&#…

Python基础之List列表用法

1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]:获取数组的第2个元素。 names[1:3]:获取数组的第2、第3个元素。包含左侧,不包含右侧。 names[:3]等同于names[0:3]&…

DAY3 JAVA基本语法

了解注释 注释是写在程序中对代码进行解释说明的文字,方便自己和其他人查看,以便理解程序的。 注释不影响程序的运行,编译后的class文件夹没有内容 字面量 在Java中,字面量(literal)是用来表示源代码中常量值的符号。 这些字面量可以直接出现在Java源代码中,并且它们代…

搜狗翻译体验,2024四大翻译工具解析!

为了满足广大用户的需求,市面上涌现出了众多优秀的翻译工具,福昕在线翻译、福昕翻译客户端、海鲸AI翻译、搜狗翻译等。今天,我们就来对比一下这些翻译工具,看看它们各自的特点和优势。 福昕在线翻译:专业精准&#xf…

前端初识之一

网页 什么是网页 网站是指在因特网上根据一定的规则,使用 HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”,通常是HTML格式的文件,它要通过浏览器来阅读, 网页是构成网站的基本元素,它通常由…

【通过WSL2安装Ubuntu24.04系统及图形化界面】

WSL(Windows Subsystem for Linux)是一个为Windows用户设计的兼容层,它允许用户在Windows10和Windows11操作系统上直接运行GNU/Linux环境。WSL提供了一个微软开发的Linux兼容内核接口,使得用户可以在不启动虚拟机或使用双重启动设…

PostgreSQL的学习心得和知识总结(一百五十三)|[performance]将 OR 子句转换为 ANY 表达式

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

安装Unity3D并配置VisualStudio

安装Unity3D并配置VisualStudio 由于近期课程要求,需要在电脑上安装Unity3D并配置VisualStudio,所以顺便写了本篇博文 1.下载Unity Hub 首先我们找到Unity中文官网,下载Unity Hub,它可以帮助我们管理我们的Unity项目和版本&#…

vue3.x系列之封装响应式的hooks技巧

v3.x封装一个接口请求的hooks的&#xff0c;都应该很熟练了&#xff0c;那么要实现一个响应式的hooks该怎么做&#xff1f; 实现效果 代码实现 <template><div v-if"error">Oops! Error encountered: {{ error.message }}</div><div v-else-i…

【第2章 开始学习C++】C++语句

文章目录 导语声明语句和变量赋值语句cout的新花样使用cin类简介 导语 C 程序是一组函数&#xff0c; 而每个函数又是一组语句。 C 有好几种语句&#xff0c;例如&#xff1a;声明语句创建变量&#xff0c; 赋值语句给该变量提供一个值。 声明语句和变量 计算机是一种精确的…

selenium-Alert类用于操作提示框/确认弹框(4)

之前文章我们提到&#xff0c;在webdriver.WebDriver类有一个switch_to方法&#xff0c;通过switch_to.alert()可以返回Alert对象&#xff0c;而Alert对象主要用于网页中弹出的提示框/确认框/文本输入框的确认或者取消等动作。 Alert介绍 当在页面定位到提示框/确认框/文本录入…

集成学习和随机森林

集成学习 生活中的集成学习&#xff1a; 买东西找别推荐 import numpy as np import matplotlib.pyplot as pltfrom sklearn import datasetsX, y datasets.make_moons(n_samples500, noise0.3, random_state42)plt.scatter(X[y0,0], X[y0,1]) plt.scatter(X[y1,0], X[y1,1]…

OpenSource - License 开源项目 TrueLicense

文章目录 官网集成Demo 官网 https://truelicense.namespace.global/ https://github.com/christian-schlichtherle/truelicense 集成Demo https://github.com/christian-schlichtherle/truelicense-maven-archetype https://github.com/zifangsky/LicenseDemo https://git…

工厂车间|基于springBoot的工厂车间系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完…

《Java基础》常用类

综述 深入理解包装类 和 String类 一、包装类 针对八种基本数据类型都有一个引用类型的包装类&#xff0c;这个类可以自动包装和解包 基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble 这几个类的继承关系&…

零工市场转型数字化的挑战和机遇

我们的生活因为科技而变的更加方便、便利&#xff0c;例如手机支付、网上购物&#xff0c;那么就目前的就业市场来说&#xff0c;零工市场也面临着数字化转型的挑战和机遇。 零工市场数字化的机遇&#xff1a; 1.通过大数据的计算&#xff0c;极大的提高了零工市场中的匹配效率…

跨平台应用程序本地化过程的特点

跨平台应用程序本地化不仅仅是将单词从一种语言翻译成另一种语言。这是关于调整应用程序&#xff0c;使其无缝融入全球用户的不同文化和语言环境&#xff0c;无论他们使用的是哪种设备或平台。这个过程对于跨平台应用程序来说尤其复杂&#xff0c;它们需要在多个操作系统和设备…

汽车车轮平衡块行业前景:预计2030年全球市场规模将达到10亿美元

汽车车轮平衡块&#xff0c;也称为轮胎平衡块&#xff0c;是一种安装在车轮上的配重部件。它的主要作用是帮助车轮在高速旋转状态下保持动平衡。当车轮高速旋转时&#xff0c;由于车轮的动态不平衡状态&#xff0c;会导致车辆在行驶中出现车轮抖动和方向盘震动的现象。汽车车轮…

[Python] 文件操作详解

文章目录 文件是什么&#xff1f;常用的文件操作函数1. 打开文件2. 关闭文件3. 读取文件(1) read() 方法(2) readline() 方法(3) readlines() 方法 4. 写入文件(1) write() 方法(2) 追加写入 5. 文件读写模式总结 中文文件的处理指定文件编码 上下文管理器示例&#xff1a;使用…