代码随想录学习Day 20

669.修剪二叉搜索树

题目链接

讲解链接

思路:采用递归方法,若root.val > high,判断左子树是否为空,若不空,递归遍历左子树,若空就返回null;若root.val < low,则判断右子树是否为空,若不空就递归遍历右子树,若空就返回null;如果low <= root.val <= high,就递归遍历左右子树,最后返回根节点即可。

递归三部曲:

1.递归函数参数及返回值:参数就是当前节点,边界值low,high。返回值为修剪后的二叉搜索树的根节点。

def trimBST(self, root, low, high):

2.递归终止条件:遇到空则返回

if not root:return None

3.单层递归逻辑:若当前节点小于low,则遍历其左子树;大于high则遍历其右子树。之后将下一层处理完左右子树的结果返回给当前根节点的左右孩子,最后返回root节点。

if root.val < low:return self.trimBST(root.right, low, high)
if root.val > right:return self.trimBST(root.left, low, high)
root.left = self.trimBST(root.left, low, high)
root.right = self.trimBST(root.right, low, high)
return root

完整代码如下:

class Solution:def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:if not root:  # 若为空则返回Nonereturn Noneif root.val < low:  # 小于low则返回其右子树修剪后的结果return self.trimBST(root.right, low, high)  # 注意这里不能直接返回root.right,因为以root.right为根节点的树不一定符合区间条件,需要进行递归修剪elif root.val > high:  # 大于high则返回其左子树修剪后的结果return self.trimBST(root.left, low, high)root.left = self.trimBST(root.left, low, high)  # 将处理完左子树的结果返回给上一层的左孩子root.right = self.trimBST(root.right, low, high)  # 同上,返回给右孩子return root

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

题目链接

讲解链接

思路:构造二叉树一般考虑前序遍历的方式。本题由于要构造的是一颗平衡二叉搜索树,所以要选取数组最中间的元素来作为根节点,然后两边的元素递归构造左右子树,这样才能保证左右子树的高度相差不超过1。代码则与之前做过的构造最大二叉树类似,只需将求最大元素改为求最中间元素即可。

class Solution:def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:if not nums:  # 数组为空则返回空return Nonemid = len(nums) // 2  # 找数组最中间的元素root = TreeNode(nums[mid])  # 最中间元素作为根节点->中root.left = self.sortedArrayToBST(nums[:mid])  # 递归构造左子树->左root.right = self.sortedArrayToBST(nums[mid+1:])  # 递归构造右子树->右return root  # 返回根节点

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

题目链接

讲解链接

将本题换一个角度来看,就是对一个有序数组[2, 5, 13]求其从后到前的累加数组,也就是[20, 18, 13]。在二叉搜索树中最右下角的元素是最大的,所以遍历顺序应该是右中左(反中序遍历),从最大的元素开始,每个节点的值为当前值与前一个节点的值的和

递归三部曲:

1.递归函数参数及返回值:参数就是当前遍历的节点,不需要返回值,但需要定义一个全局变量pre来保存当前节点前一个节点的值。

def __init__(self):self.pre = 0
def traversal(self, root):

2.递归终止条件:遇到空则直接返回。

if not cur:return

3.单层递归逻辑:进行反中序遍历,先遍历右子树,再遍历左子树,将每个节点的值改为其当前值与pre值的和。

self.traversal(cur.right)
cur.val += self.pre
self.pre = cur.val
self.traversal(cur.left)

整体代码如下:

class Solution:def __init__(self):self.pre = 0  # 定义pre让其保存cur的前一个节点的值,初始为0def traversal(self, cur):if not cur:  # 遇到空则返回returnself.traversal(cur.right)  # 右cur.val += self.pre  # 改变节点值self.pre = cur.val  # pre=当前节点的值self.traversal(cur.left)  # 左def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:self.traversal(root)return root

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

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

相关文章

C#——系统学习(类与对象)

类&#xff08;Class&#xff09; 定义与作用&#xff1a; 类是C#中的一种用户自定义类型&#xff0c;它是面向对象编程的核心元素之一。类是一种蓝图或者模板&#xff0c;它描述了一类具有相同特性和行为的事物。类通常包含以下部分&#xff1a; 字段&#xff08;Fields&…

JAVA面试八股文之集合

JAVA集合相关 集合&#xff1f;说一说Java提供的常见集合&#xff1f;hashmap的key可以为null嘛&#xff1f;hashMap线程是否安全, 如果不安全, 如何解决&#xff1f;HashSet和TreeSet&#xff1f;ArrayList底层是如何实现的&#xff1f;ArrayList listnew ArrayList(10)中的li…

Day24:私信列表、私信详情、发送私信

测试用户&#xff1a;用户名aaa 密码aaa 查询当前用户的会话列表&#xff1b;每个会话只显示一条最新的私信&#xff1b;支持分页显示。 首先看下表结构&#xff1a; conversation_id: 用from_id和to_id拼接&#xff0c;小的放前面去&#xff08;因为两个人的对话应该在一个会…

Siemens S7-1500TCPU 运动机构系统功能简介

目录 引言&#xff1a; 1.0 术语定义 2.0 基本知识 2.1 运动系统工艺对象 2.2 坐标系与标架 3.0 运动机构系统类型 3.1 直角坐标型 3.2 轮腿型 3.3 平面关节型 3.4 关节型 3.5 并联型 3.6 圆柱坐标型 3.7 三轴型 4.0 运动系统的运动 4.1 运动类型 4.1.1 线性运动…

ssh 启动 docker 中 app, docker logs 无日志

ssh 启动 app, 标准输出被重定向 ssh 客户端&#xff0c;而不是 docker 容器的标准输出。只需要在启动时把app 标准输出重定向到 docker标准输出。 测试如下&#xff1a; 1.启动 docker docker run -it -p 60022:22 --name test test:v4 bash -c "service ssh restart;…

C# —— 系统学习(控制结构)

下面时所有控制结构的实例与解析 条件分支结构 - if-else int score 85; if (score > 90) {Console.WriteLine("优秀"); else if (score > 80) {Console.WriteLine("良好"); } else {Console.WriteLine("合格"); } 这段代码使用的是if-…

新手体验OceanBase社区版V4.2:离线部署单节点集群

本文源自OceanBase用户的分享 先简单总结如下&#xff1a; 1.本文适合初学者体验OceanBase社区版 v4.2.2 2.仅需准备一台配置为2C/8G的Linux虚拟机 3.通过离线方式安装&#xff0c;以便更直观地了解安装过程 一、Linux系统准备 在宿主机(即你的windows PC电脑)上安装vbox软…

【JavaEE初阶系列】——多线程案例四——线程池

目录 &#x1f6a9;什么是线程池 &#x1f388;从池子中取效率大于新创建线程效率(why) &#x1f6a9;标准库中的线程池 &#x1f388;为什么调用方法而不是直接创建对象 &#x1f388;工厂类里的方法 &#x1f4dd;newCachedThreadPool() &#x1f4dd;newFixedThread…

【微服务】Nacos(配置中心)

文章目录 1.AP和CP1.基本介绍2.说明 2.Nacos配置中心实例1.架构图2.在Nacos Server加入配置1.配置列表&#xff0c;加号2.加入配置3.点击发布&#xff0c;然后返回4.还可以编辑 3. 创建 Nacos 配置客户端模块获取配置中心信息1.创建子模块 e-commerce-nacos-config-client50002…

Matlab之求直角坐标系下两直线的交点坐标

目的&#xff1a;在直角坐标系下&#xff0c;求两个直线的交点坐标 一、函数的参数说明 输入参数&#xff1a; PointA&#xff1a;直线A上的点坐标&#xff1b; AngleA&#xff1a;直线A的倾斜角&#xff0c;单位度&#xff1b; PointB&#xff1a;直线B上的点坐标&#xf…

LeetCode - 股票平滑下跌阶段的数目(分组循环)

2110. 股票平滑下跌阶段的数目 当数组中的数字满足这个prices[i] 1 prices[i - 1]条件之后&#xff0c;就是平滑下降的阶段&#xff0c;也就是将数组中连续的数字进行一个分组。每次计算一个分组即可。 class Solution { public:long long getDescentPeriods(vector<int&…

如何写好一篇文档?

&#x1f304; 前言 什么是好的文档&#xff1f;在我看来&#xff0c;不减分地表达清楚作者的意图&#xff0c;即是一个不错的文档&#xff0c; 从作者角度上讲&#xff0c;能够让读者快速、清晰理解作者要表达的内容。 从读者角度上讲&#xff0c;读者能够快速、清晰地了解到…

分布式部署LNMP+WordPress

需要四台虚拟机&#xff0c;实际上&#xff0c;我们只需要操作三台 一个数据库&#xff0c;一个nginx&#xff0c;一个php&#xff0c;还需要准备一个软件包wordpress-4.7.3-zh_C 首先配置nginx的服务环境 [rootnginx ~]# vi /usr/local/nginx/conf/nginx.conf 修改文件中的loc…

蓝桥杯23年第十四届省赛真题-三国游戏|贪心,sort函数排序

题目链接&#xff1a; 1.三国游戏 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2023年第十四届省赛真题-三国游戏 - C语言网 (dotcpp.com) 虽然这道题不难&#xff0c;很容易想到&#xff0c;但是这个视频的思路理得很清楚&#xff1a; [蓝桥杯]真题讲解&#xff1a;三国游戏&#xff0…

2. Java基本语法

文章目录 2. Java基本语法2.1 关键字保留字2.1.1 关键字2.1.2 保留字2.1.3 标识符2.1.4 Java中的名称命名规范 2.2 变量2.2.1 分类2.2.2 整型变量2.2.3 浮点型2.2.4 字符型 char2.2.5 Unicode编码2.2.6 UTF-82.2.7 boolean类型 2.3 基本数据类型转换2.3.1 自动类型转换2.2.2 强…

数字图像处理——直方图的均衡化

1.方法简介&#xff1a; 直方图均衡化通常用来增加许多图像的全局对比度&#xff0c;尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法&#xff0c;亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度&#xff0c;直方图均衡化通…

电源66319D控制方法

实现自动化控制&#xff0c;电源为基础的模块&#xff0c;下面为大家讲解电源66319D的控制逻辑。 新建底层控制逻辑 在文件basis_contorl.py中写入仪器控制底层代码&#xff0c;代码如下&#xff1a; import tkinter.messagebox import pyvisaclass InstrumentControl(object…

探析Zoho Projects项目管理系统功能优势

世上万物&#xff0c;都是有难有易&#xff0c;有简单&#xff0c;也有复杂&#xff0c;项目也不例外。面对复杂的项目&#xff0c;应该如何有效管理呢&#xff1f;答案无疑是项目管理系统&#xff0c;项目管理系统有哪些强大的功能&#xff1f;Zoho Projects项目管理系统的功能…

Qt中常用宏定义

Qt中常用宏定义 一、Q_DECLARE_PRIVATE(Class)二、Q_DECLARE_PRIVATE_D(Dptr, Class)三、Q_DECLARE_PUBLIC(Class)四、Q_D(Class) 和 Q_Q(Class) 一、Q_DECLARE_PRIVATE(Class) #define Q_DECLARE_PRIVATE(Class) inline Class##Private* d_func() { # 此处的 d_ptr 是属于QOb…

【数据分层方法论】初稿

一般标准数据架构有(ODS、DWD、DWS、DIM、ADS) 一般数据构架问题&#xff1a; 1.架构定位与边界不清楚&#xff0c;导致ADS烟囱化开发&#xff1b; 2.ADS集市缺少统一规划、混乱低效&#xff1b; 3.ADS集市指标口径急需要统一&#xff1b; 4.缺少高质量的设计标准&#xff0c;…