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…

深入浅出:数据库的世界 - 介绍、分类、作用与特点

一、引言 A. 数据库的普遍性与重要性 数据库是现代信息技术中不可或缺的重要组成部分,无论是企业、学术机构还是个人用户,在日常生活和工作中都会接触到数据库。它承载着海量的数据,为各种应用程序提供数据存储、管理和检索功能。 B. 数据…

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

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

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

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;//重载小于号,按右端…

C标准库函数与Unbuffered I/O函数:平台间的差异与适用性

C标准库函数 C标准库函数&#xff0c;作为C语言规范的核心组成部分&#xff0c;被广泛应用于所有支持C语言的平台之上。这些函数定义在stdio.h头文件中&#xff0c;涵盖了诸如输入输出处理、内存管理、字符串操作、数学运算等诸多基础功能。尽管在某些平台上&#xff0c;部分C…

【力扣二刷思路】DAY3

215. 数组中的第K个最大元素 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路 …

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…

VMware错误解决

1、错误&#xff1a;operating system not found: 编辑虚拟机 &#xff1a;找到CD/DVD并点击 --- 映像文件 2、VMware:no boot filename received 解决方法&#xff1a;重新换个镜像&#xff0c;网上各种网站的镜像大多都是有问题&#xff0c;最推荐的网站还是 MSDN, 我告…

大型政企智能化升级,有了“验方”

随着两会落下帷幕&#xff0c;“人工智能”正式上升为国家战略&#xff0c;智能化建设的浪潮席卷而来。在这场转型升级的浪潮中&#xff0c;大型政企扮演着举足轻重的角色。它们不仅是智能化升级的重要力量&#xff0c;更是引领行业变革、推动社会进步的关键因素。 在智能化升…

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

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

this指向是在那个全局变量?

在浏览器环境中&#xff0c;如果没有特殊处理&#xff0c;全局对象是 window 对象。因此&#xff0c;在浏览器环境中&#xff0c;this 的指向在全局作用域中将是 window 对象。在 Node.js 环境中&#xff0c;全局对象是 global 对象。 举例来说&#xff0c;在浏览器环境下&…

月度工作计划

以下是一份可能的月度工作计划&#xff0c;包含了您提供的关键词&#xff1a; 第一周&#xff1a;需求分析和项目规划 需求分析 确定爬虫的目标网站和所需数据。分析所需解析的民航相关知识网站的内容结构。 项目规划 制定项目时间表和里程碑。分配资源和任务。 第二周&…

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…

C# EPPlus导出dataset----Excel3样式

目录 一、单元格计算 二、隐藏操作 三、全局样式 四、指定范围样式

Python实战:Flask轻量级web框架入门

Flask是一个轻量级的Web框架&#xff0c;它是由Armin Ronacher开发的&#xff0c;使用Python语言编写。Flask易于上手&#xff0c;具有高度的可扩展性&#xff0c;非常适合快速开发Web应用程序。 一.Flask简介 Flask是一个基于Werkzeug WSGI工具箱和Jinja2模板引擎的Web框架。…

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

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