代码随想录算法训练营第二十四天|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…

大数据ETL工具kettle-spoon

大数据ETL工具kettle-spoon9.4&#xff0c;主要提供数据抽取、转换、加载功能。 下载地址&#xff1a;https://download.csdn.net/download/xsfqh/89292236

P1802 5 倍经验日

题目描述: 现在 absi2011 拿出了 &#x1d465;x 个迷你装药物&#xff08;嗑药打人可耻…&#xff09;&#xff0c;准备开始与那些人打了。 由于迷你装药物每个只能用一次&#xff0c;所以 absi2011 要谨慎的使用这些药。悲剧的是&#xff0c;用药量没达到最少打败该人所需的…

【数据库】SELECT 语句的完整指南

在 MySQL 数据库中&#xff0c;SELECT 语句是最常用的查询工具之一。它允许用户从一个或多个表中检索数据&#xff0c;并可以应用各种条件、排序、聚合和其他操作。本文将介绍 MySQL 中 SELECT 语句的各种用法&#xff0c;包括基本语法、条件筛选、聚合函数、排序、分组、多表连…

Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;方法区&#xff08;Method Area&#xff09;是一个特殊的内存区域&#xff0c;用于存储类信息、常量、静态变量以及编译后的代码等。从Java 8开始&#xff0c;方法区的概念发生了一些变化&#xff0c;其中一些功能被转移…

谷歌搅局AI制药,进击的AlphaFold3模型 | 最新快讯

AI制药角逐战。 文&#xff5c;氨基观察 结构生物学是生物学的核心领域之一&#xff0c;其核心任务是揭示生物分子的三维结构&#xff0c;这对于理解其功能和行为至关重要。 传统的结构测定方法&#xff0c;如X射线晶体学和核磁共振&#xff08;NMR&#xff09;技术&#xff0…

如何在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…

1847B - Hamon Odyssey

这里写目录标题 Odd Divisor※前置知识🐬完整代码:Odd Divisor 洛谷题目|CF原题|V站题目 ※前置知识 and 即 & —— 按位与。 按位与的特性: a , b ≥ a a n d b a , b ≥ a \ and \ b a,b≥a and b 因此可以得出题中的最小值: a 1 a n d a 2 a n d .…

C数据结构:栈和队列应用场景

计算器实例 main.c #include <stdlib.h> #include <stdio.h> #include "sqstack.h"void compute(sqstack* snum,datatype* data) {datatype n1,n2,n;st_pop(snum,&n2);st_pop(snum,&n1);switch(*data){case :n n1 n2;break;case -:n n1 - n2…

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

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

LocalDate 数据库不兼容问题,因为LocalDate 是 long 类型的

我今天遇到一报错&#xff1a; SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession316f9272] was not registered for synchronization because synchronization is not active JDBC Connection [HikariProxyConnection2127597288 wrapping com.mysql.cj.jdbc…

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 可通过继承父模…