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

669. 修剪二叉搜索树

文档讲解:代码随想录

代码链接:. - 力扣(LeetCode)

这道题目中删除的可能不只是一个节点

常见误区:

     遇到一个不在区间范围内的节点,我们不能直接将其删除,因为其左右孩子可能是符合要求的。比如,如果节点值大于了区间的右端点,那么这个节点的左孩子中可能是有符合要求的节点的。如果如果节点值小于了区间的左端点,那么这个节点的右孩子中可能是有符合要求的节点的。因为这是一颗二叉搜索树,节点的右孩子的值大于节点的值,节点的左孩子的值小于节点的值

正确的思路:

     如果遇到了一个节点的值小于左边界的值,那么这个节点的左孩子都可以被删除了;我们可以直接向右去递归遍历,去修剪该节点对应的右子树(因为右子树中的点不一定都是符合要求的),修剪的结果即是在根节点上修剪的结果

      如果节点的值大于右边界了,那么这个节点的右孩子都可以被删除了。我们可以直接向左去递归遍历,去修剪该节点对应的左子树(因为左子树中的点不一定都是符合要求的),修剪的结果即是在根节点上修剪的结果

递归的三要素:

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

传入一个节点和左右区间,返回修剪之后的二叉树的根节点

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

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

如果传入的节点的值超出了区间的范围,那么就开始修剪,并且返回修剪后的根节点即可。根据上面的分析,决定我们向左递归修剪还是向右递归修剪

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

如果传入的节点在区间内,那么我们就要分别对左右子树进行修剪,并且将修建后的左右子树的根节点依然传回原来的根节点。

class Solution:def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:# 如果根节点为空,则返回空if not root:return None# 如果根节点的值大于high,说明整个右子树都不符合条件,因此只需要修剪左子树if root.val > high:node = self.trimBST(root.left, low, high)return node# 如果根节点的值小于low,说明整个左子树都不符合条件,因此只需要修剪右子树if root.val < low:node = self.trimBST(root.right, low, high)return node# 修剪左子树和右子树,并更新根节点的左右子树root.left = self.trimBST(root.left, low, high)root.right = self.trimBST(root.right, low, high)return root

108.将有序数组转换为二叉搜索树

 文档讲解:代码随想录

代码链接:. - 力扣(LeetCode)

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

题目中强调的是高度平衡,为什么强调要平衡呢?因为只要给我们一个有序数组,如果不强调平衡,都可以以线性结构来构造二叉搜索树

构造二叉树的本质:寻找分割点,分割点作为当前节点,然后递归左区间和右区间

本题问题:如果数组长度为偶数,中间节点有两个,取哪一个?

答案:取哪一个都可以,只不过构成了不同的平衡二叉搜索树。

如果要分割的数组长度为偶数的时候,中间元素为两个。这也是题目中强调答案不是唯一的原因

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

传入一个数组,返回根据这个数组构造的平衡二叉树的根节点

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

如果传入传入的数组的长度为1,那么就return 这一个节点

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

如果传入的数组的长度不为1,那么就要找到根节点,然后递归构造左右子树

写法一

class Solution:def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:# 如果输入数组只有一个元素,将该元素作为树的根节点返回if len(nums) == 1:return TreeNode(nums[0])# 在递归的过程中有可能会遇到空数组的情况,因此需要进行判断if len(nums) != 0:# 计算数组的中间索引,以便将中间元素作为树的根节点index = len(nums) // 2# 创建当前树的根节点,值为数组中间索引处的元素root = TreeNode(nums[index])# 递归构建当前根节点的左子树,传入左半部分的数组作为参数root.left = self.sortedArrayToBST(nums[0:index])# 递归构建当前根节点的右子树,传入右半部分的数组作为参数root.right = self.sortedArrayToBST(nums[index+1:])# 返回当前根节点及其左右子树构成的平衡二叉搜索树return rootelse:# 如果数组为空,则返回 None,表示当前子树为空树return None

 写法二:

class Solution:def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:if len(nums) == 1:return TreeNode(nums[0])index = len(nums)//2#向下取整root = TreeNode(nums[index]) #递归构造根节点的左右子平衡树,只有非空才有左右子树if index>0:root.left = self.sortedArrayToBST(nums[0:index])if index<len(nums)-1:root.right = self.sortedArrayToBST(nums[index+1:])return root

主要是要注意区间是否非空,否则会报错:list out of index

538.把二叉搜索树转换为累加树

文档讲解:代码随想录

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

依然是在遍历过程中,双指针的应用,需要对遍历过程很熟悉 

class Solution:def __init__(self):# 初始化变量 'pre' 用于跟踪当前节点之前所有节点值的总和self.pre = 0def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:if not root:return None# 以逆中序遍历(右-根-左)的方式遍历树,更新节点值self.traversal(root)  # 从最右边的节点开始遍历return rootdef traversal(self, cur):if not cur:return None# 递归遍历右子树以累加节点值到 'pre'self.traversal(cur.right)  # 从最右边的节点开始遍历cur.val += self.pre  # 将当前节点值更新为之前所有节点值的总和self.pre = cur.val  # 更新 'pre' 为当前节点值# 递归遍历左子树self.traversal(cur.left)  # 继续向左最节点遍历

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

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

相关文章

转转小程序数据处理

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872&#xff0c;x30184483x…

仿照JDK源码写一个ArrayList实现

仿照JDK编写一个简化的ArrayList实现是一个很好的学习Java集合框架内部工作原理的方式。以下是一个简化版的ArrayList实现,它包含了基本的添加、获取、删除和大小检查功能。 public class MyArrayList<E> {private static final int DEFAULT_CAPACITY = 10;private Obj…

20240511日记

今天工作内容&#xff1a; 1.二期2号机EAP测试 2.二期开门机器暂停&#xff08;停轴&#xff0c;停流水线电机&#xff09;&#xff0c;关闭门后继续功能测试 3.针点位偏移还需要调整&#xff0c;未进行大批量验证是否偏移&#xff08;S3模板点位测试&#xff0c;两台机各焊…

BUU-[GXYCTF2019]Ping Ping Ping

考察点 命令执行 题目 解题 简单测试 ?ip应该是一个提示&#xff0c;那么就测试一下?ip127.0.0.1 http://0c02a46a-5ac2-45f5-99da-3d1b0b951307.node4.buuoj.cn:81/?ip127.0.0.1发现正常回显 列出文件 那么猜测一下可能会有命令执行漏洞&#xff0c;测试?ip127.0.…

SolidWorks将装配体中的草图投影到零件中

SolidWorks将装配体中的草图投影到零件中 在SolidWorks中&#xff0c;将装配体中的草图投影到零件中是一种高级技术&#xff0c;特别适用于那些需要基于装配体上下文创建或修改零件的情形。这个过程不仅有助于确保零件间的精确配合&#xff0c;还能显著提高设计效率。下面是一…

dos命令改3389端口,通过dos命令更改3389端口的操作

要使用DOS命令更改3389端口&#xff0c;通常涉及修改Windows注册表中的相关键值。请注意&#xff0c;直接操作注册表具有一定的风险&#xff0c;因此在进行任何更改之前&#xff0c;请确保您了解正在进行的操作&#xff0c;并已经采取了适当的备份措施。 以下是一个基本的操作步…

记录一次接口优化的过程。接口响应时间从500s下降到5s。

记录一次接口优化的过程。接口响应时间从500s下降到5s。 接口说明&#xff1a; 该接口通过用户导入的一年内每天的厂区用电功率数据来计算用户安装储能设备后的收益情况。 用电功率数据具体为每15分钟一条&#xff0c;一年约有 12*30*24*4 34560 条。 代码循环情况为&…

ES 7.0.0 升级 7.1.0,离线升级

-- 已亲测&#xff0c;可用 1. 停止es 7.0 服务&#xff0c;集群需要全部停止 2. 备份es 7.0 的数据文件 cp -r data data70 3. 下载es 7.1 版本 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.0-linux-x86_64.tar.gz 4. 将es 7.0 的数据文件复…

详解GaussDB(DWS)中的行执行引擎

1.前言 GaussDB&#xff08;DWS&#xff09;包含三大引擎&#xff0c;一是SQL执行引擎&#xff0c;用来解析用户输入的SQL语句&#xff0c;生成执行计划&#xff0c;供执行引擎来执行&#xff1b;二是执行引擎&#xff0c;其中包含了行执行引擎和列执行引擎&#xff0c;执行引擎…

event::Events::DisconnectWorldUpdateBegin 没有

问题&#xff1a; ROS项目编译报错event::Events::DisconnectWorldUpdateBegin 没有 解决方法&#xff1a; GAZEBO版本问题导致有些函数被删&#xff0c;解决方法直接找到对应版本的源文件进行替换&#xff0c;即可。 ROS18.04 Gazebo9 robotiq85 视觉机械臂抓取仿真_error:…

CentOS常见的命令及其高质量应用

CentOS是一个流行的、基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的开源服务器操作系统。由于其稳定性和强大的性能&#xff0c;CentOS被广泛应用于各种服务器环境中。为了有效地管理和维护CentOS系统&#xff0c;熟悉并掌握其常见命令是非常重要的。本文将介绍…

当时这样说就好了的笔记

系列文章目录 当时这样说就好了的笔记 文章目录 系列文章目录一、 不用好口才&#xff0c;怎么谈都讨喜的“说话金律”1、 掌握对方爱聊什么是交谈热络的第一步2、 装笨让对方当主角&#xff0c;和谁都能聊不停3、 “讲道理”谁都怕&#xff0c;坚持己见最伤感情4、 懂“聆听附…

Coursera吴恩达深度学习专项课程01: Neural Networks and Deep Learning 学习笔记 Week 04 (完结)

Neural Networks and Deep Learning Course Certificate 本文是学习 https://www.coursera.org/learn/neural-networks-deep-learning 这门课的笔记 Course Intro 文章目录 Neural Networks and Deep LearningWeek 04: Deep Neural NetworksLearning Objectives Deep L-layer…

mac第三方软件怎么删除 MacBook卸载第三方应用程序 mac第三方恶意软件删除不了怎么办呢

Mac是一款优秀的个人电脑&#xff0c;它拥有流畅的操作系统、强大的性能和丰富的应用程序。但是&#xff0c;随着使用时间的增加&#xff0c;你可能会发现你的Mac上安装了一些不需要或者不喜欢的第三方软件&#xff0c;这些软件可能会占用你的空间、影响你的速度或者带来安全风…

MahApps.Metro的MVVM模式介绍(一)

MahApps.Metro是一个开源的WPF (Windows Presentation Foundation) UI 控件库。它的特点有现代化设计、主题定制、响应式布局、内置控件。 而Mvvm模式的核心思想是将用户界面&#xff08;View&#xff09;与应用程序逻辑&#xff08;ViewModel&#xff09;分离&#xff0c;以实…

电商大数据的采集||电商大数据关键技术【基于Python】

.电商大数据采集API 什么是大数据&#xff1f; 1.大数据的概念 大数据即字面意思&#xff0c;大量数据。那么这个数据量大到多少才算大数据喃&#xff1f;通常&#xff0c;当数据量达到TB乃至PB级别时&#xff0c;传统的关系型数据库在处理能力、存储效率或查询性能上可能会遇…

设计模式-创建型-原型模式-prototype

工作经验类 public class WorkExperience implements Cloneable {private String workDate;private String company;public void setWorkDate(String workDate) {this.workDate workDate;}public void setCompany(String company) {this.company company;}Overridepublic Ob…

nuxt2路由,以及重构以前项目,路由使用

Nuxt.js根据pages目录结构自动生成vue-router模块的路由配置。 配置生成的路由可在.nuxt文件下的router.js文件中查看到&#xff0c;如&#xff1a; export const routerOptions {mode: history,base: /,linkActiveClass: nuxt-link-active,linkExactActiveClass: nuxt-link…

GAME101-Lecture06学习

前言 上节课主要讲的是三角形的光栅化。重要的思想是要利用像素的中心对三角形可见性的函数进行采样。 这节课主要就是反走样。 课程链接&#xff1a;Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)_哔哩哔哩_bilibili 反走样引入 ​ 通过采样&#xff0c;得到…

算法设计与分析 例题解答 解空间与搜索

1.请画出用回溯法解n3的0-1背包问题的解空间树和当三个物品的重量为{20, 15, 10}&#xff0c;价值为{20, 30, 25}&#xff0c;背包容量为25时搜索空间树。 答&#xff1a; 解空间树&#xff1a; 搜索空间树&#xff1a; 2. 考虑用分支限界解0-1背包问题 给定n种物品和一背包…