备战蓝桥杯Day26 - 二叉搜索树查询和删除操作

一、查询

递归查询

寻找的值比根节点大,遍历右子树;

寻找的值比根节点小,遍历左子树。

    def qurey(self, node, val):if not node:  # 没有节点,返回空return Noneif node.data < val:return self.qurey(node.rchild, val)elif node.data > val:return self.qurey(node.lchild, val)else:return node

非递归查询 

通过比较,指针不断向下移动,直到找到节点。

 def query_no_rec(self, val):p = self.rootwhile p:if p.data < val:p = p.rchildelif p.data > val:p = p.lchildelse:return preturn None

二、删除 

删除操作思路

删除操作比较难,需要考虑三种情况

1、删除叶子节点:直接删除

2、如果删除的节点只有一个孩子:将此节点的孩子与父亲链接,然后删除此节点。(如果删除的根节点只有一个孩子,删除根节点后,要重新更新一下根节点)

3、如果要删除的节点有两个孩子,将其右子树的最小节点(该节点最多有一个右孩子)替换当前节点,并删除。

详细解释

第一种情况:叶子节点

如果只有一个根节点,那么把根节点置为空就算删除。

如果是叶子节点,将该节点的父节点指向空,即为删除这个节点。ps:需要判断是左孩子还是右孩子

    def __remove_node_1(self, node):# 情况1:node是叶子节点if not node.parent:self.root = Noneif node == node.parent.lchild:node.parent.lchild = Noneelse:node.parent.rchild = None

第二种情况:2.1 只有一个左孩子

2.1.1

如果是删除根节点,那么将根节点直接指向左孩子即可。

2.1.2

如果是树中的某一个左孩子,且只有一个左孩子,那么将该节点的父节点指向该节点的左孩子,并将指向该节点左孩子的指针指向该节点的父节点。

这个过程有点绕,多理解理解就好了,下面配图帮助理解。图中蓝线是指针变化后应该指向的位置。

2.1.3

如果是树中的某一个右孩子,且只有一个左孩子,那么将该节点的父节点指向该节点的左孩子,并将指向该节点左孩子的指针指向该节点的父节点。

实现代码

    def __remove_node_21(self, node):# 情况2.1:node只有一个左孩子if not node.parent:self.root = node.lchildnode.parent.lchild = Noneelif node == node.parent.lchild:node.parent.lchild = node.lchildnode.lchild.parent = node.parentelse:node.parent.rchild = node.lchildnode.lchild.parent = node.parent

第二种情况:2.2 只有一个右孩子 

2.2.1

如果是删除根节点,那么将根节点直接指向右孩子即可。

2.2.2

如果是树中的某一个左孩子,且只有一个右孩子,那么将该节点的父节点指向该节点的右孩子,并将指向该节点右孩子的指针指向该节点的父节点。

2.2.3

如果是树中的某一个右孩子,且只有一个右孩子,那么将该节点的父节点指向该节点的右孩子,并将指向该节点右孩子的指针指向该节点的父节点。

实现代码

    def __remove_node_22(self, node):# 情况2.2:node只有一个右孩子if not node.parent:self.root = node.rchildelif node == node.parent.lchild:node.parent.lchild = node.rchildnode.rchild.parent = node.parentelse:node.parent.rchild = node.rchildnode.rchild.parent = node.parent

 第三种情况:左右两个孩子都有

3.1 在右子树中寻找最小的数。因为你删除的那个节点需要有数字替代,那么就是右子树中最小的那个数。

3.2 for循环遍历右子树的左孩子,找到最小的值。

3.3 把找到的最小的数替换到要删除的节点位置。

3.4 判断我们找到的最小数是只有右孩子的情况还是叶子节点的情况。这个节点不可能会有左孩子的情况,因为我们寻找最小数的已经找到最后一个左孩子了。

实现代码

                min_node = node.rchildwhile min_node.lchild:min_node = min_node.lchildnode.data = min_node.data# 删除min_node节点if min_node.rchild:self.__remove_node_22(node)else:self.__remove_node_1(node)

删除操作整个实现

没有右孩子就是只有一个左孩子

没有左孩子就是只有一个右孩子

    def delete(self, val):if self.root:   # 不是空树查询节点node = self.query_no_rec(val)if not node:return Falseif not node.lchild and not node.rchild:  # 1. 叶子节点self.__remove_node_1(node)elif not node.rchild:   # 2.1只有一个左孩子self.__remove_node_21(node)elif not node.lchild:   # 2.3 只有一个右孩子self.__remove_node_22(node)else:  # 3.两个孩子都有min_node = node.rchildwhile min_node.lchild:min_node = min_node.lchildnode.data = min_node.data# 删除min_node节点if min_node.rchild:self.__remove_node_22(node)else:self.__remove_node_1(node)

ok这就是查询和删除操作!代码一定要自己手敲!多动手!勤思考!一定会有进步的! 

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

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

相关文章

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS多路视频融合叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的S…

C++第六弹---类与对象(三)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、类的6个默认成员函数 2、构造函数 2.1、概念 2.2、特性 3、析构函数 3.1、概念 3.2、特性 3.3、调用顺序 总结 1、类的6个默认成员函数…

QT UI窗口常见操作

MainWidget::MainWidget(QWidget *parent): QWidget(parent), ui(new Ui::MainWidget) {ui->setupUi(this);// 设置主窗口背景颜色QPalette plt;plt.setColor(QPalette::Window,QColor(180,220,130));this->setPalette(plt);// 禁止窗口最大化按钮setWindowFlags(windowF…

Spring Boot Starter: 快速简明地创建Spring应用

Spring Boot Starter是Spring Boot的核心功能之一&#xff0c;它帮助开发人员快速简明地创建、配置和运行Spring应用。在本文中&#xff0c;我们将详细介绍Spring Boot Starter以及如何使用它创建一个Spring Boot应用。 文章目录 什么是Spring Boot Starter?为何使用Spring B…

DevOps 环境预测测试中的机器学习

在当今快节奏的技术世界中&#xff0c;DevOps 已成为软件开发不可或缺的一部分。它强调协作、自动化、持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;&#xff0c;以提高软件部署的速度和质量。预测测试是这一领域的关键组成部分&#xff0c;其中机器…

Transformer的前世今生 day02(神经网络语言模型

神经网络语言模型 使用神经网络的方法&#xff0c;去完成语言模型的两个问题&#xff0c;下图为两层感知机的神经网络语言模型&#xff1a; 以下为预备概念 感知机 线性模型可以用下图来表示&#xff1a;输入经过线性层得到输出 线性层 / 全连接层 / 稠密层&#xff1a;假…

爬虫的去重

去重基本原理 爬虫中什么业务需要使用去重 防止发出重复的请求防止存储重复的数据 在爬取网页数据时&#xff0c;避免对同一URL发起重复的请求&#xff0c;这样可以减少不必要的网络流量和服务器压力&#xff0c;提高爬虫的效率&#xff0c;在将爬取到的数据存储到数据库或其…

HTML设置语言

一、代码示例 相关代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>HTML设置语言</title> </head> <body><marquee>我爱你</marquee> <!-- …

离线LaTex公式识别V1.0开发

离线LaTex公式识别V1.0开发 前期的工作 请看博文-离线LaTex公式识别V0.9开发 已完成的内容 LaTex公式识别的GUI。 支持将LaTex复制为MathML。 支持读取剪切板的图片。 部分UI换成iconfont下载的一些元素。 读懂pyqt的一些代码。基本实现了万能君的软件库的所有功能。 开发…

从底层结构开始学习FPGA(0)----FPGA的硬件架构层次(BEL Site Tile FSR SLR Device)

系列目录与传送门 《从底层结构开始学习FPGA》目录与传送门 Xilinx的FPGA&#xff0c;从硬件架构的角度可以划分为6个层次&#xff0c;从底层到顶层依次是&#xff1a; BEL&#xff08;最底层单元&#xff09;SiteTileFSRSLRDevice&#xff08;FPGA芯片&#xff09; 接下来我…

UG NX二次开发(C#)-单选对话框UF_UI_select_with_single_dialog的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、UF_UI_select_with_single_dialog函数3、实现代码3.1 利用委托创建一个方法3.2 直接调用1、前言 对于单选对话框,采用C++/C写的时候比较容易,也在帮助文档中有示例,但是对于C#开发采…

WEB三大组件之Filter

在很多项目中通常需要用到filter来实现用户身份识别&#xff0c;并将识别出来的用户信息&#xff0c;保存到ThreadLocal对应的上下文&#xff0c;这样在后续的请求链路中&#xff0c;在任何地方都可以直接获取当前的登录用户了。 来看一下Java WEB三大组件之一的过滤器Filter&…

L2-042 老板的作息表(PTA)

文章目录 L2-042 老板的作息表题目描述sort排序函数 L2-042 老板的作息表 题目描述 新浪微博上有人发了某老板的作息时间表&#xff0c;表示其每天 4:30 就起床了。但立刻有眼尖的网友问&#xff1a;这时间表不完整啊&#xff0c;早上九点到下午一点干啥了&#xff1f; 本题就…

UnityShader:IBL

效果&#xff1a; 实现&#xff1a; Shader "MyShader/IBL" {Properties{_CubeMap ("环境贴图", Cube) "white" {}_Exposure("曝光",float)1.0_Color("颜色",color)(1,1,1,1)_NormalMap("法线贴图",2d)"bu…

Python——pgzero游戏打包exe执行时报错

Python——pgzero游戏打包exe执行时报错 记录一次使用 pgzero 开发游戏&#xff0c;使用 pyinstaller 打包时报错 目录结构&#xff1a; 1. 第一次报错 打包指令&#xff1a; pyinstaller -Fw .\code.py结果打开报错 报错如下&#xff1a; Traceback (most recent call…

【Web】记录[长城杯 2022 高校组]b4bycoffee题目复现

目录 前言 环境准备 简单分析 EXP(两种打法) 生成Payload 恶意类 ①Spring命令执行回显类 ②Filter型内存马 前言 本地jar包运行打通了&#xff0c;远程500&#xff0c;nss靶机有问题&#xff0c;换了bugku就可( 主要记录下做题过程&#xff0c;纯菜狗&#xff0c;小…

Linux——开发工具yum与vim

Linux——开发工具yum与vim 文章目录 Linux——开发工具yum与vim一、Linux 软件包管理器-yum1.1 什么是软件包1.2 yum的使用 二、linux下的编辑器-vim2.1 vim的基本概念2.2 vim的基本操作插入模式下的基本命令底行模式下的基本指令 2.3 vim的配置 一、Linux 软件包管理器-yum …

8-图像缩放

其实&#xff0c;就是开辟一个zoomwidth&#xff0c;zoomheight的内存&#xff0c;再分别赋值即可。 void CDib::Scale(float xZoom, float yZoom) { //指向原图像指针 LPBYTE p_data GetData(); //指向原像素的指针 LPBYTE lpSrc; //指向缩放图像对应像素的指针 LPBYTE lpDs…

数据结构——lesson8二叉树的实现

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

论文阅读——BLIP

BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation &#xff08;1&#xff09;单模态编码器&#xff0c;它分别对图像和文本进行编码。图像编码器用ViT&#xff0c;并使用附加的 [CLS] 标记来表示全局图像特征。文本…