代码随想录算法训练营第二十四天|235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

##递归法class Solution:def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:if not root:return  TreeNode(val)#向左遍历if val > root.val:    root.right = self.insertIntoBST(root.right,val) #1#向右遍历elif val < root.val:root.left =  self.insertIntoBST(root.left,val) #2return root

235. 二叉搜索树的最近公共祖先

文档讲解:代码随想录

题目链接:. - 力扣(LeetCode)

提到二叉搜索树,那么我们就要好好利用它的特性 

p和q的公共祖先一定是在p和q的中间的(如果一个节点在p和q之间,那么说明p在这个节点的左子树,q在这个节点的右子树中),所以:

p和q的最近公共祖先一定是小于等于p和q的中的最大值,大于等于p和q中的最小值的

所以当前遍历的节点如果在这个范围的右边,那么我们就向左遍历,反之向右遍历

是否一定是最近的公共祖先呢?假设现在找到了一个公共节点,如果我们再向左或者右遍历,那么就会错过p或者q。所以找到的一定是最近的公共祖先

递归法

递归的三要素:

第一要素:明确这个函数想要干什么

传入一个节点,找到这个节点对应的二叉树中p和q的最近公共祖先

第二要素:寻找递归结束条件

如果传入的是空那么就return 空

如果传入的节点的值就在p和q之间,那么就return 这个节点

第三要素:找出函数的等价关系式

如果当前遍历的节点如果在这个范围的右边,那么我们就继续向左遍历,反之向右遍历

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':##终止条件if not root:return Noneif root.val>min(p.val,q.val) and root.val < max(p.val,q.val):return root##递归遍历if root.val < min(p.val,q.val):return self.lowestCommonAncestor(root.right,p,q)elif root.val > max(p.val,q.val):return self.lowestCommonAncestor(root.left,p,q)else:return root

迭代法 

class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':##终止条件if not root:return Nonewhile root:if root.val < min(p.val,q.val):root = root.rightelif root.val > max(p.val,q.val):root = root.leftelse:return root

701.二叉搜索树中的插入操作

文档讲解:代码随想录

题目链接:. - 力扣(LeetCode)

有多种插入方式,我们选择直接在叶子节点插入

要点:在二叉搜索树中,插入任何一个节点,都可以在叶子节点找到它的位置。主要是要比较要插入的节点与当前遍历到的节点的大小,决定我们是向左还是向右遍历,直到遇到空节点,将数值插入即可,保证二叉搜索树的特性不变。

递归法

迭代法

##迭代法
class Solution:def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:if not root:return TreeNode(val)current = rootwhile  current: ##不可以用root循环,因为会不变改变root,最后还要返回root#向左遍历if val > current.val:if current.right == None:current.right =  TreeNode(val)breakcurrent= current.right#向右遍历elif val < current.val:if current.left == None:current.left =  TreeNode(val)breakcurrent= current.leftreturn root

450.删除二叉搜索树中的节点

文档讲解:代码随想录

题目链接:. - 力扣(LeetCode)

 与上题相比添加节点只要在叶子节点添加即可,但是删除二叉树的节点需要改变二叉树的结构,比上题难得多。分五种情况

①没有找到删除的节点

②要删除的节点是叶子节点:不用改变二叉树的结构,较简单

③要删除的节点左不为空,右为空

④要删除的节点左为空,右不为空

⑤左右都不空。假设我们让右子树即位,那么原来左子树就要寻找一个新的父节点,只需要找比原来父节点稍微大一点的数即可。即右子树中最左侧的节点,这样就比左子树稍微大一点点。

递归的三要素:

第一要素:明确这个函数想要干什么

传入一个节点,删除以这个节点为根节点的二叉树中的特定值,并返回删除后的二叉树(根节点)

第二要素:寻找递归结束条件

上面说到的5点

第三要素:找出函数的等价关系式

根据特定的搜索方向删除左子树或者右子树中的值,删除完之后不要忘记,让根节点指向它们,因为根节点还在的,我们只是修改了根节点的左子树或者右子树,删完之后要更新一下

class Solution:def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:#如果是空if not root:return None#如果当前节点是要删除的节点if root.val == key:#如果要删除的节点是叶子节点if not root.left and not root.right:return None#左不为空,右为空if root.left and not root.right:return root.left#左为空,右不为空if not root.left and root.right:return root.rightif root.left and root.right:cur = root.right##找到右子树最左边的节点while cur.left:cur = cur.leftcur.left = root.left##相当于左孩子为空了,直接返回右孩子即可return root.right#递归,二叉搜索树决定了搜索的方向else:if key > root.val:node =  self.deleteNode(root.right,key)root.right = nodereturn rootelse: node =  self.deleteNode(root.left,key)root.left = nodereturn root

这几道题目的递归函数都是有返回值的,并且让上一个节点的左孩子或者右孩子接住了,之后还是要好好消化消化

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

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

相关文章

【HMWeb】HTML使用Leaflet实现本地离线地图Gis应用

下载Leaflet 官网下载&#xff1a;https://leafletjs.com/reference.html CSDN&#xff1a;https://download.csdn.net/download/hmxm6/89291989 选择版本号 添加html文件 加入代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

记一次DNS故障导致用户无法充值的问题(下)

上一篇说到DNS故障导致无法充值&#xff0c;后来我们通过拨测发现业务域名的解析目标地址被解析到了【127.0.0.1】IP。 1、联系阿里云厂商&#xff0c;通过沟通&#xff0c;阿里云反馈我们的域名被XX省通管单位封禁了&#xff0c;导致解析到了不正确的地址。 2、为了解决用户问…

【hackmyvm】 Animetronic靶机

靶机测试 arp-scanporturl枚举exiftool套中套passwordsudo 提权 arp-scan arp-scan 检测局域网中活动的主机 192.168.9.203 靶机IP地址port 通过nmap扫描&#xff0c;获取目标主机的端口信息 ┌──(root㉿kali)-[/usr/share/seclists] └─# nmap -sT -sV -O 192.16…

如何在JavaScript/Vue中获取当前时间并格式化输出(精确到时分秒)

如何在JavaScript/Vue中获取当前时间并格式化输出&#xff08;精确到时分秒&#xff09; 不只是树&#xff0c;人也是一样&#xff0c;在不确定中生活的人&#xff0c;能比较经得起生活的考验&#xff0c;会锻炼出一颗独立自主的心。在不确定中&#xff0c;就能学会把很少的养分…

CTF例题和知识点

[ACTF2020 新生赛]Include 打开靶机发现一个超链接&#xff0c;点击之后出现一段话 “Can you find out the flag?” 查看源码注入&#xff0c;无果 仔细看url&#xff0c;发现有flag.php 根据题目提示&#xff0c;该题应该是文件包含漏洞&#xff0c;因此可以判断出此题是PH…

基于SpringBoot的全国风景区WebGIS按省展示实践

目录 前言 一、全国风景区信息介绍 1、全国范围内数据分布 2、全国风景区分布 3、PostGIS空间关联查询 二、后台查询的设计与实现 1、Model和Mapper层 2、业务层和控制层设计 三、WebGIS可视化 1、省份范围可视化 2、省级风景区可视化展示 3、成果展示 总结 前…

P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数

蓝桥杯2023国B A、B题 A题 分析 dp问题 根据子序列&#xff1a;2&#xff0c;20&#xff0c;202&#xff0c;2023分为4个状态&#xff1b; 当前数字为2时&#xff0c;处于dp[0]&#xff0c;或者和dp[1]结合成dp[2]&#xff1b; 当前数字为0时&#xff0c;和dp[0]结合成dp[…

keil5软件安装教程(MDKv5.39)

keil5软件安装分为三部分&#xff1a; 目录 1.安装mdk 2.激活mdk 3.安装STM32芯片包 1.安装mdk 安装包链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1PZoGhzI5Y19ROv7xe9QJKA?pwdgt3s 提取码&#xff1a;gt3s 1、下载keil5的压缩包并解压&#xff0c;鼠…

buuctf-misc题目练习三

荷兰宽带数据泄露 BIN 文件&#xff0c;也称为二进制文件&#xff0c;是一种压缩文件格式&#xff0c;可以 包含图像和视频等信息 , 并被许多应用程序用于各种目的。 RouterPassView是一个找回路由器密码的工具。 大多数现代路由器允许备份到一个文件路由器的配置&#xff0c…

CDGA|电子行业数据治理六大痛点及突围之道

CDGA|电子行业数据治理六大痛点及突围之道 随着信息技术的迅猛发展&#xff0c;电子行业对数据的需求和依赖日益增强。然而&#xff0c;数据治理作为确保数据质量、安全性及有效利用的关键环节&#xff0c;在电子行业中却面临着一系列痛点。本文将深入探讨电子行业数据治理的六…

CTFHUB-技能树-Web题-RCE(远程代码执行)-文件包含

CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09; 文件包含 文章目录 CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09;文件包含解题方法1:![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/71f7355b3c124dfe8cdf1c95e6991553.png#pic_ce…

【Java基础】Maven继承

1. 前言 Maven 在设计时&#xff0c;借鉴了 Java 面向对象中的继承思想&#xff0c;提出了 POM 继承思想。 2. Maven继承 当一个项目包含多个模块时&#xff0c;可以在该项目中再创建一个父模块&#xff0c;并在其 POM 中声明依赖&#xff0c;其他模块的 POM 可通过继承父模…

4D 成像毫米波雷达:新型传感器助力自动驾驶

1 感知是自动驾驶的首要环节&#xff0c;高性能传感器必不可少 感知环节负责对侦测、识别、跟踪目标&#xff0c;是自动驾驶实现的第一步。自动驾驶的实现&#xff0c;首先要能够准确理解驾驶环境信息&#xff0c;需要对交通主体、交通信号、环境物体等信息进行有效捕捉&#x…

热爱电子值得做的电子制作实验

加我zkhengyang&#xff0c;进嵌入式音频系统研究开发交流答疑群(课题组) AM/FM收音机散件制作&#xff0c;磁带随声听散件&#xff0c;黑白电视机散件制作&#xff0c;功放散件制作&#xff0c;闪光灯散件制作&#xff0c;声控灯散件&#xff0c;等等&#xff0c;可提高动手能…

MultiBoot 和 QuickBoot

目录 MultiBoot简介MultiBoot 实现方式设置 bitstream 属性使用 ICAPE2 原语WBSTAR 寄存器定义 MultiBoot 工作流程生成mcs固化文件 Tcl 指令Fallback状态寄存器MultiBoot 正常加载状态看门狗1超时状态看门狗2超时状态CRC 错误和无 DESYNC 命令IDCODE 错误状态CRC 错误状态 Wat…

17 【Aseprite 作图】参考图和颜色

参考图 Aseprite 作图&#xff0c;“打开 - 一张参考图”&#xff0c;再把参考图拉到右边&#xff0c;就可以得到参考图和缩略图 取消选区 通过“选择 - 取消选择”&#xff0c;可以 取消选区 复制参考图的颜色 打开参考图后&#xff0c;参考图的调色板就会出现参考图所有的…

202466读书笔记|《一天一首古诗词》——借问梅花何处落,风吹一夜满关山

202466读书笔记|《一天一首古诗词》——借问梅花何处落&#xff0c;风吹一夜满关山 上册下册 《一天一首古诗词》作者李锡琴&#xff0c;蛮早前加入书架的已购买书籍&#xff0c;这次刚好有点时间&#xff0c;利用起来读完。 赏析没有细看&#xff0c;只读了诗词部分&#xff0…

Java数组的应用---选择排序(Select Sort)

一、需求&#xff1a;选择排序(Select Sort)&#xff0c;进行升序显示 在一组排列中把最大的数取出来放在一个新的列表里&#xff0c;再删去&#xff0c;在取最大的数出来&#xff0c;依次类推直到取到最后一个数字 二、定义一个无序的一维数组&#xff0c;并输出数组 程序运…

LabVIEW自动机械变速器(AMT)开发

LabVIEW自动机械变速器&#xff08;AMT&#xff09;开发 在现代汽车工业中&#xff0c;提升车辆的自动化水平和驾驶体验是一个不断追求的目标。随着技术的发展&#xff0c;自动机械变速器&#xff08;AutomatedMechanical Transmission, AMT&#xff09;凭借其较高的能效和较低…

面向对象 03:类与对象的创建、初始化和使用,通过 new 关键字调用构造方法,以及创建对象过程的内存分析

一、前言 记录时间 [2024-05-10] 系列文章简摘&#xff1a; Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 Java 笔记 11&#xff1a;Java 方法相关内容&#xff0c;方法的设计原则&#xff0c;以及方法的定义和调用 面向对象 01&#xff1a;Java 面向对…