代码随想录学习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:  # 若为空则返回None
            return None
        if 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 None
        mid = 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的前一个节点的值,初始为0
    def traversal(self, cur):
        if not cur:  # 遇到空则返回
            return
        self.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.mfbz.cn/a/499328.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【娱乐】战双帕弥什游戏笔记攻略

文章目录 Part.I IntroductionChap.I Information Part.II 新手攻略Chap.I 角色和武器挑选Chap.II 新手意识推荐 Part.II 阵容搭配Chap.I 一拖二Chap.II 毕业队 Reference Part.I Introduction 2019年12月5日全平台公测。 偶然间入坑战双&#xff0c;玩了几天&#xff0c;觉得…

V R虚拟现实元宇宙的前景|虚拟现实体验店加 盟合作|V R设备在线购买

VR&#xff08;虚拟现实&#xff09;技术作为一种新兴的技术&#xff0c;正在逐渐改变人们的生活和工作方式。随着技术的不断进步&#xff0c;人们对于元宇宙的概念也越来越感兴趣。元宇宙是一个虚拟世界&#xff0c;通过VR技术可以实现人们在其中进行各种活动和交互。 元宇宙的…

戴尔灵越3000来说2.5G的双核显存能干啥?

吃鸡已经成为大家耳熟能详的网络游戏。 很多人认为&#xff0c;想要享受吃鸡的乐趣&#xff0c;就必须组装一台高端电脑。 虽然配置越高越好&#xff0c;但现实是很多配置都是以性能为标准的。 有余了&#xff0c;没必要刻意追求高配置、高特效。 说实话&#xff0c;吃鸡不一定…

【Qt】:多种方式编辑hello world

多种方式编辑hello world 一.QLabel二.对象树三.使用单行编辑框四.使用按钮 (小技巧&#xff1a;1.可以使用F4来进行头文件和对应cpp文件的切换&#xff1b;2.写完一个函数的声名之后,按下altenter,就可以自动的在对应的cpp 文件中添加函数的定义了.) 一.QLabel 注意这里是QSt…

数据可视化基础与应用-04-seaborn库从入门到精通01-02

总结 本系列是数据可视化基础与应用的第04篇seaborn&#xff0c;是seaborn从入门到精通系列第1-2篇。本系列的目的是可以完整的完成seaborn从入门到精通。主要介绍基于seaborn实现数据可视化。 参考 参考:数据可视化-seaborn seaborn从入门到精通01-seaborn介绍与load_datas…

【SpringCloud】Ribbon负载均衡

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

java多线程中的阻塞队列

一、普通不阻塞队列 还记得队列我们如何实现吗&#xff1f;我们用的是循环队列的方式&#xff0c;回一下&#xff1a; 描述&#xff1a;开始tail和head指针都指向最开始位置&#xff0c;往里面添加元素tail&#xff0c;出元素head 初始状态&#xff1a; put元素后状态 take…

KOSMOS-2.5: A Multimodal Literate Model

KOSMOS-2.5: A Multimodal Literate Model 相关链接&#xff1a;arXiv 关键字&#xff1a;multimodal、literate model、text-intensive images、Transformer architecture、document-level text recognition 摘要 我们介绍了KOSMOS-2.5&#xff0c;这是一个用于机器阅读文本密…

2024知乎广告推广怎么做,知乎推广教程!

随着社交媒体影响力的日益增强&#xff0c;知乎作为中国高质量知识分享社区的代表&#xff0c;已经成为品牌方精准触达目标受众的重要阵地。云衔科技凭借其专业的一站式广告服务能力&#xff0c;为企业提供知乎广告开户及代运营解决方案&#xff0c;助力企业在知乎平台上实现品…

这6个png免抠素材网,免费下载,值得收藏!

找png免抠素材&#xff0c;就上这6个网站&#xff0c;免费下载&#xff0c;可商用。设计师必备&#xff0c;赶紧收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/searchlist/66008----all-0-1.html?vNTYxMjky 网站主要分享设计素材为主。像平面海报、免抠元素、背景图…

前端学习<二>CSS基础——08-CSS属性:定位属性

CSS的定位属性有三种&#xff0c;分别是绝对定位、相对定位、固定定位。 position: absolute; <!-- 绝对定位 -->​position: relative; <!-- 相对定位 -->​position: fixed; <!-- 固定定位 -->​ 下面逐一介绍。 相对定位 相对定位&#xff1a;让…

经典永不过时 Wordpress模板主题

经得住时间考验的模板&#xff0c;才是经典模板&#xff0c;带得来客户的网站&#xff0c;才叫NB网站。 https://www.jianzhanpress.com/?p2484

用xshell或ftp连接本地虚拟机linux系统,centos7修改动态ip地址

如果不知道怎么下载vm本地虚拟机软件或者不知道怎么安装可以参考我上一篇博客 vmWare虚拟机下载安装详细教程,手把手一步一步教学-CSDN博客 安装好虚拟机软件我们想要通过xshell和ftp工具来管理,小黑框不太舒服哈哈哈 一.准备工作 输入命令来查看当前的ip地址 ip addr 可以…

【目标跟踪】红绿灯跟踪

文章目录 一、前言二、结果三、跟踪3.1、检测输入3.2、预测与运动补偿3.3、第一次匹配3.4、第二次匹配3.5、第三次匹配3.6、航迹的起始与信息的发布 四、后记 一、前言 红绿灯场景对当前无人驾驶来说是个灾难性的挑战。暂且不说复杂的十字路口&#xff0c;譬如简单的人行道红绿…

Go语言学习Day6:数组与切片

名人说&#xff1a;莫愁千里路&#xff0c;自有到来风。 ——钱珝 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1. 数组① 什么是数组② 数组的声明③ 初始化数组的几种方式④ 遍历数组元素⑤ 数组为值类型⑥ 数…

云平台教程 | 手把手教你绘制时序分析

爱基百客云平台小工具——时序分析使用教程目录 1 爱基百客云平台之时序分析 2 参数设置 3 任务查看 4 结果 01 爱基百客云平台小工具使用 首先&#xff0c;打开爱基百客官网&#xff1a;http://www.igenebook.com&#xff1b;点击菜单栏最右侧“云平台”按钮。 弹出云平…

Qt实现Kermit协议

1 概述 Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。 其特性如下: Kermit文件运输协议是一个半双工的通信协议。它支持7位ASCII字符。数据以可多达96字节长度的可变长度的分组形式传输。对每个被传送分组需要一个确认。Kerm…

红米手机Redmi 不会自动弹出USB调试选项,如何处理?(红米小米均适用)

参考&#xff1a; 红米手机Redmi 不会自动弹出USB调试选项&#xff0c;如何处理&#xff1f;&#xff08;红米小米均适用&#xff09; - 知乎 以红米9A为例&#xff1b; 【设置】菜单进入后&#xff0c;找到【我的设备】&#xff0c; 选择【全部参数】&#xff0c; 对准miui版…

什么是framebuffer,怎么应用(二)————如何打印BMP图片、字幕函数、字符串

如何切换到终端模式 在昨天写的文章中&#xff0c;没有写到如何切换到终端模式&#xff0c;在编译完函数之后&#xff0c;我们需要从桌面切换到终端模式&#xff1a; ALTCTRLF3切换到终端模式后&#xff0c;登录账号名与密码&#xff0c;其余操作均有桌面终端一样。 如何切换…

机器学习概论—增强学习

机器学习概论—增强学习 强化学习(Reinforcement Learning, RL)或者说是增强学习,是机器学习的一个领域,旨在使智能体通过与环境的交互学习如何做出决策,它是关于在特定情况下采取适当的行动来最大化奖励。它被各种软件和机器用来寻找在特定情况下应采取的最佳行为或路径…
最新文章