python实现--二叉搜索树

什么是二叉搜索树

二叉搜索树(Binary Search Tree,BST)是一种特殊类型的二叉树,它具有以下性质:
每个节点最多有两个子节点,分别称为左子节点和右子节点。
对于任意节点,其左子树中的所有节点的值都小于该节点的值。
对于任意节点,其右子树中的所有节点的值都大于该节点的值。
对于任意节点,其左子树和右子树也分别是二叉搜索树。
在这里插入图片描述

二叉搜索树特点

有序性:二叉搜索树中的节点按照一定的顺序排列,左子树的值小于根节点的值,右子树的值大于根节点的值。这使得在树中进行搜索、插入或删除操作时具有高效性能。
快速查找:由于有序性,可以利用二叉搜索树进行快速查找操作。通过比较目标值与当前节点的值,可以根据大小关系递归地在左子树或右子树中继续查找目标值。
插入和删除操作:由于二叉搜索树的有序性,插入和删除操作可以保持树的有序性。插入操作按照节点值的大小关系找到合适的位置插入新节点。删除操作需要维护树的有序性,并根据节点的情况进行相应的调整。

二叉搜索树的常见操作

查找(Search)

在二叉搜索树中查找给定值。从根节点开始,比较目标值与当前节点的值,根据大小关系递归地在左子树或右子树中查找,直到找到目标值或遍历到叶子节点。
以下实例在二分搜索树中寻找 43 元素
在这里插入图片描述

(1) 元素 43 比根节点 42 大,需要在右子节点继续比较。

在这里插入图片描述

(2) 元素 43 比 59 小,需要在左子节点继续比较。
在这里插入图片描述

(3) 元素 43 比 51 小,需要在左子节点继续比较。
在这里插入图片描述
(4) 查找 51 的左子节点 43,正好和相等,结束。

插入(Insertion)

向二叉搜索树中插入新节点。按照节点值的大小关系,递归地在左子树或右子树中找到合适的位置插入新节点。
以下实例向如下二分搜索树中插入元素 61 的步骤:
在这里插入图片描述

(1)需要插入的元素 61 比 42 大,比较 42 的右子树根节点。
在这里插入图片描述

(2)61 比 59 大,所以需要把 61 移动到 59 右子树相应位置,而此时为空,直接插入作为 59 的右子节点。

在这里插入图片描述

插入操作也是一个递归过程,分三种情况,等于、大于、小于。

删除(Deletion)

从二叉搜索树中删除节点。删除节点时,需要考虑节点的子树情况和维护树的有序性。常见的情况包括删除叶子节点、删除只有一个子节点的节点以及删除有两个子节点的节点。
1、删除只有左孩子的节点,如下图节点 58

在这里插入图片描述

删除掉元素 58,让左子树直接代替 58 的位置,整个二分搜索树的性质不变。
在这里插入图片描述
2、删除只有右孩子的节点,如下图节点 58

在这里插入图片描述

删除掉元素 58,让右子树直接代替 58 的位置,整个二分搜索树的性质不变。
在这里插入图片描述

3、删除左右都有孩子的节点,如下图节点 58
在这里插入图片描述

(1)找到右子树中的最小值,为节点 59
在这里插入图片描述在这里插入图片描述

(2)节点 59 代替待删除节点 58
在这里插入图片描述

最小值和最大值(Minimum and Maximum)

最小值在树的最左边叶子节点上,最大值在树的最右边叶子节点上。

遍历(Traversal)

按照一定的顺序遍历二叉搜索树的所有节点。常见的遍历方式包括深度优先遍历和广度优先遍历。

前序遍历:

在这里插入图片描述

中序遍历:

在这里插入图片描述

后序遍历:

在这里插入图片描述

层序遍历:

通过引入一个队列来支撑层序遍历:
如果根节点为空,无可遍历;
如果根节点不为空:
先将根节点入队;
只要队列不为空:
出队队首节点,并遍历;
如果队首节点有左孩子,将左孩子入队;
如果队首节点有右孩子,将右孩子入队;

(1)先取出根节点放入队列
在这里插入图片描述

(2)取出 29,左右孩子节点入队

在这里插入图片描述

(3)队首 17 出队,孩子节点 14、23 入队。

在这里插入图片描述

(4)31 出队,孩子节点 30 和 43 入队

在这里插入图片描述

(5)最后全部出队
在这里插入图片描述

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

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

相关文章

python 调用redis创建查询key

部署redis apiVersion: apps/v1 # 描述api版本,默认都用这个 kind: Deployment # 资源类型,可以配置为pod,deployment,service,statefulset等等 metadata: # deployment相关的元数据,用于描述deployment的…

LeetCode199题:二叉树的右视图(python3)

代码思路:深度优先搜索,每次总访问右子树,value_depth用dict存放,深度为索引,存放节点的值,stack从根节点[(root, 0)]开始,添加node和depth class Solution:def rightSideView(self, root: Opt…

测试工具分享:高效完成测试工作!

说在前头 在社会上,特别是技术圈,大家会有刻板印象:测试工作的含金量不高。因为大家觉得测试不重要,导致给测试的薪水也偏低;这又反向导致好的人才不想来测试行业,测试从业人员的平均水平、工作体现的价值…

贪心算法(算法竞赛、蓝桥杯)--线段覆盖

1、B站视频链接&#xff1a;A29 贪心算法 P1803 线段覆盖_哔哩哔哩_bilibili 题目链接&#xff1a;凌乱的yyy / 线段覆盖 - 洛谷 #include <bits/stdc.h> using namespace std;struct line{int l,r;bool operator<(line &b){return r<b.r;//重载小于号,按右端…

Windows系统安装GeoServe结合内网穿透实现公网访问本地位置信息服务

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

ai写作一键生成,分享6种好用的写作软件,一定要看

在写文章时&#xff0c;我们常常会遇到灵感丧失、词句不顺的情况&#xff0c;为了解决这一问题&#xff0c;小编为大家推荐几款实用的AI写作软件&#xff0c;一同来探索一下吧&#xff01; 一、爱制作AI 爱制作AI是一款专注于写作的软件&#xff0c;强大的智能数据库让它备受…

Docker进阶:离线安装docker社区版(docker-18.06.3-ce)

Docker进阶&#xff1a;离线安装docker社区版&#xff08;docker-18.06.3-ce&#xff09; 1、准备离线安装所需的文件2、传输文件至目标Linux系统3、卸载旧版Docker4、离线安装Docker1、解压上传的Docker安装包2、拷贝文件到/usr/bin目录3、将 Docker 注册为系统服务4、重新加载…

力扣203. 移除链表元素

写法1、头节点 和 后面的节点 删除规则不一致 class Solution {public ListNode removeElements(ListNode head, int val) {//如果不建虚拟头节点&#xff0c;那删头节点和删后面的节点&#xff0c;逻辑是不一样的//头节点可能连续多个命中val,所以有while&#xff0c;不是ifwh…

2684. 矩阵中移动的最大次数

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid &#xff0c;矩阵由若干 正 整数组成。 …

How to upgrade NBU cluster from 10.0.0.1 to 10.2.0.1

1. Environment Statement OS: SuSE 12 SP4 InfoScale: 7.4.2 NBU: 10.0.0.1 2. Download EEB patch and utf8 tools 2.1 Donwload utf8 check tools from Veritas. utf8 character check before NBU upgrade, upgrade will be failed if “NBDB” is using utf8 characte…

thinkphp 微信商户转账到微信小程序用户零钱(v3密钥版)

这几天做项目有一个需求,小程序用户提交记录后,商家后台审核通过自动转账到用户的微信零钱中. 今天分享下如何实现自动打款, 一种是用v2密钥的接口:企业付款到零钱 一种是用v3密钥的接口:微信商户转账到零钱(听说是v2接口的微信商户容易被限制,后来就改成v3了) php后端代码 v3…

Linux中判断某个Docker容器服务的内存是否超过临界值,比如到达10G,则在凌晨4点执行定时任务执行重新构建命令

监测NAME是blade-jiangxinzhougarden的服务&#xff0c;如果内存&#xff08;MEM USAGE&#xff09;超过10G则在凌晨4点执行重新构建命令 1.编写脚本文件restart_jxz.sh #!/bin/bash# 设置要监控的容器名称或服务名称(替换成你的服务名) SERVICE_NAME"blade-jiangxinzhou…

正信晟锦:老板拖工资怎么说比较合适

在职场中&#xff0c;老板拖欠工资是一个敏感而棘手的问题。面对这一情况&#xff0c;员工应保持冷静与专业&#xff0c;采取合适的方式表达自己的合理关切&#xff0c;并寻求问题的解决。 私下与老板进行沟通。选择一个适当的时机&#xff0c;以尊重和理解的态度开场&#xff…

每日一题——LeetCode1694.重新格式化电话号码

方法一 模拟&#xff1a; 首先去除number里面的破折号和空格&#xff0c;取出纯数字组成的字符串str。 对于str每三个数分成一组&#xff0c;加一个破折号&#xff0c;当str的长度小于等于4时再分情况讨论&#xff0c;如果等于4就分为22形式&#xff0c;如果小于4&#xff0c…

Springboot 整合Mybatis 实现增删改查(二)

续上篇&#xff1a;Springboot整合Mybatis的详细案例图解分析-CSDN博客 mapper层&#xff08;StudentMapper&#xff09; //通过id查询student方法Student searchStudentById(int id);//通过id删除student方法int deleteStudentById(int id);//通过id增加student方法int inser…

基于springboot+vue的乡政府管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Fay数字人<助理版>具体编译步骤,手把手带你避坑 | 多图预警 ( python 3.11 编译环境 超详细教程 )

Fay数字人<助理版>具体编译步骤 系列教程环境描述一、搭建编译环境1、下载anaconda2、下载Fay(带货版)源码 二、Fay编译参数配置&#xff08;手把手教学&#xff09;(一)Fay具体编译步骤(二)配置 aliyun key(三)配置 aliyun 智能语音交互app(四)修改并配置自己的FAY数字…

解决后端传给前端的日期问题

解决方式&#xff1a; 1). 方式一 在属性上加上注解&#xff0c;对日期进行格式化 但这种方式&#xff0c;需要在每个时间属性上都要加上该注解&#xff0c;使用较麻烦&#xff0c;不能全局处理。 2). 方式二&#xff08;推荐 ) 在WebMvcConfiguration中扩展SpringMVC的消息转…

canal问题记录:something goes wrong when doing authentication: auth failed for user:

一、问题描述 部署了1.15服务端 canal.deployer-1.1.5 用于监听mysql的binlog日志&#xff0c;同时在项目中集成了canal client,用于在监听到指定数据表变化时自定义写入es。 服务端配置&#xff1a; 客户端配置&#xff1a; public void run() {// 创建链接CanalConnector …

全流程ArcGIS Pro技术应用

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…