代码随想录算法训练营第二十三天丨669. 修剪二叉搜索树、​ 108. 将有序数组转换为二叉搜索树​、538. 把二叉搜索树转换为累加树

【项目解析】2KW 230V 数字逆变器控制系统(二) 【项目解析】 2KW 230V 数字逆变器控制系统(一) 项目的 交流输出电压 并不是单纯一个电压环就能控制好的,而是典型的 双环控制架构:最终占空比控制量会经过计算: 然后写入 单片机 TMM 定时器的比较寄存器 (TMGRA0/TMGRD0/TMGRC1), → 定时器输出互补 PWM, → 驱动 IGBT 全桥, → 经过 LC 滤波形成 230 VAC / 50Hz 的正弦电压。总结交流电压是双环控制的结果:目标/作用:把输出 RMS 电压稳到目标(例如 230 VAC);在母线波动与负载变化下 阅读详情

669. 修剪二叉搜索树

递归:

总算自己能想明白了!

递归终止:遇到空节点停止。

递归过程:如果一个节点小于low了,说明左子树也都小于low,那就return右子树。反之,大于high说明右子树都大于high,return左子树。如果在范围内,则左边连接递归修剪完的左子树,右边连接递归修剪完的右子树。

class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if not root:
            return None
            
        if root.val < low:
            return self.trimBST(root.right, low, high)
        elif root.val > high:
            return self.trimBST(root.left, low, high)
        else:
            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]:
        while root and (root.val < low or root.val > high):
            if root.val < low:
                root = root.right
            else:
                root = root.left
            
        cur = root
        while cur:
            while cur.left and cur.left.val < low:
                cur.left = cur.left.right
            cur = cur.left
            
        cur = root
        while cur:
            while cur.right and cur.right.val > high:
                cur.right = cur.right.left
            cur = cur.right
        return root

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

递归:

空数组直接返回None,将数组分成两份,左边一半右边一半,中间取出来的数就是根节点,左边都比他小,右边都比他大,随后递归地连接左子树和右子树。

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

迭代:

迭代会复杂一点,使用栈来模拟:

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums:
            return None

        # 中间节点的索引
        mid = len(nums) // 2

        # 创建根节点
        root = TreeNode(nums[mid])

        # 栈用于存储节点和对应的子数组范围
        stack = [(root, 0, mid - 1, mid + 1, len(nums) - 1)]

        while stack:
            node, left_start, left_end, right_start, right_end = stack.pop()

            # 处理左子树
            if left_start <= left_end:
                mid_left = (left_start + left_end) // 2
                node.left = TreeNode(nums[mid_left])
                stack.append((node.left, left_start, mid_left - 1, mid_left + 1, left_end))

            # 处理右子树
            if right_start <= right_end:
                mid_right = (right_start + right_end) // 2
                node.right = TreeNode(nums[mid_right])
                stack.append((node.right, right_start, mid_right - 1, mid_right + 1, right_end))

        return root

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

递归:

双指针,右中左遍历。

class Solution:
    def __init__(self, prev = None):
        self.prev = prev
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return root
        self.convertBST(root.right)
        if self.prev:
            root.val += self.prev.val
        self.prev = root
        self.convertBST(root.left)
        return root

迭代:

class Solution:
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return root
        
        stack = []
        cur = root
        prev = None
        while stack or cur:
            while cur:
                stack.append(cur)
                cur = cur.right
            cur = stack.pop()
            if prev:
                cur.val += prev.val
            prev = cur
            cur = cur.left
        return root

今日总结:

太感动了,自己能写这些递归了!!

感觉刷完整个二叉树章节,对递归、递归回溯有了比较深刻的理解。

Autosar Configuration(十四)SomeIP之配置SoAd 本文主要介绍SomeIp协议栈中的SoAd在Configurator中的详细配置 阅读详情

相关推荐

VScode+MPLAB AI助手:Microchip MCU开发全流程实战解析

本文详细解析了如何使用VScode搭配MPLAB AI助手进行Microchip MCU开发的完整流程。从环境配置、工程创建到代码生成与调试,全面介绍了AI助手在提升开发效率、优化代码和故障排除方面的实际应用,为嵌入式开发者提供了一套高效的开发解决方案。

hh234的博客 1131

代码随想录算法训练营Day26 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

训练营第26天:669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

jiabao0520的博客 1241

spring-ai 1.0.0 学习(四)——提示词管理

摘要:本文介绍Spring AI中提示词管理的最佳实践。首先展示基础样例,指出直接传递用户输入的局限性。随后分析优质提示词应包含系统消息、上下文信息、输出结构和问答样例四要素。文章详述两种实现方式:链式调用(使用ChatClient构建器)和传统对象创建方法。进阶部分涵盖核心接口(Prompt、Message等)、消息类型、模板渲染配置(支持自定义)及提示词工程技巧(如RAG、任务分解)。最后提及高级功能如少样本模板和提示词库。全文强调结构化提示词对提升AI输出质量的关键作用,并展示Spring AI的灵活

hzp的专栏 1365

代码随想录算法训练营第二十一天|LeetCode 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、二叉树总结

二叉树题目选择什么遍历顺序?力扣二叉树大总结!二叉树需要的技能都在这里!!!

Anastasia_sakura的博客 939

不刷机!Jetson AGX Orin无损更新内核与设备树的两种安全方法(附备份恢复脚本)

本文详细介绍了Jetson AGX Orin在不刷机的情况下安全更新内核与设备树的两种方法,包括extlinux.conf动态加载和分区精准刷新方案。通过备份恢复脚本和工业级灾备方案,确保零数据丢失,适用于边缘AI和机器人等关键场景。

weixin_40192258的博客 308

【AIGC】大模型面试高频考点09-大模型Agent框架

聚焦AIGC专业技术分享

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1967

代码随想录算法训练营第二十三天 | 669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树 [二叉树篇]

二叉搜索树、递归

leehal的博客 1206

手把手教你学Simulink——光伏储能系统双向DC-AC逆变器恒功率控制(PQ控制)仿真

本文详细介绍了光伏储能系统中双向DC-AC逆变器的恒功率控制(PQ控制)仿真方法。主要内容包括:1)PQ控制原理及其在光伏满发和储能充放电中的应用;2)系统架构设计,重点推导了功率到dq电流的数学映射关系及电流内环控制算法;3)Simulink建模步骤,涵盖功率电路搭建、PLL设计、电流参考转换等关键环节;4)仿真结果分析,验证了系统在10kW光伏满发和-5kW储能充电模式下的稳态精度和动态切换性能;5)工程实践建议,包括数字控制延迟补偿、低电压穿越处理等实际问题解决方案。该指南为新能源并网系统的功率精准控

MHD0815的博客 425

代码随想录算法训练营Day18 | Leetcode 669修剪二叉搜索树、108将有序数组转换为二叉搜索树、538把二叉搜索树转换为累加树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中。改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。node.val 的值之和。

叽里呱啦大王的博客 1003

TPM 2.0实例探索2 —— LUKS磁盘加密(1)

本文对LUKS行了系统介绍

phmatthaus的专栏 1700

【AI应用实战-OpenCode】OpenCode安装部署(一)

OpenCode是一款2026年流行的开源AI编程工具,兼具轻量代码编辑器和智能编码代理功能。其核心优势包括:完全免费开源(MIT协议)、全平台兼容、支持75+大模型(含本地部署)、内置完整编程功能链(代码补全/Git集成/AI调试等),且所有数据本地存储确保隐私安全。相比Copilot等商业工具,OpenCode提供更自由的模型选择和零门槛使用体验。安装要求Windows10+/macOS12+/Linux主流发行版,仅需200MB空间和4G内存。该工具完美兼容VSCode生态,支持终端/桌面/IDE三种

2430

代码随想录算法训练营第二十一天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

代码随想录算法训练营第二十一天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

2301_81109252的博客 930

124、LLC谐振变换器的矩阵变压器设计

摘要 本文分享了LLC谐振变换器中矩阵变压器的实战设计经验。针对大功率LLC单颗变压器的痛点(绕组层数多、散热不均、漏感一致性差),作者提出将大变压器拆分为多个小变压器单元(建议6个),通过原边串联、副边并联的方式实现功率分配。详细解析了磁芯选型、匝比计算、绕组结构、漏感控制和散热设计等关键参数,特别强调了小磁芯优势、等效匝比计算误区以及三明治绕法的重要性。文中还总结了调试过程中的谐振频率偏移和均流问题解决方案,并给出了矩阵数量选择、磁芯材质、绝缘材料等实用建议。作者指出,矩阵变压器在2kW以上LLC应用中

Jack010169的博客 170

代码随想录训练营Day26 | 669. 修剪二叉搜索树 | 108.将有序数组转换为二叉搜索树 | 538.把二叉搜索树转换为累加树

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。取哪一个都可以,只不过构成了不同的平衡二叉搜索树。节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。所以结果应当返回修剪好的二叉搜索树的新的根节点。通过修剪二叉搜索树,使得所有节点的值在。

m0_68965961的博客 1146

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

代码随想录算法训练营第 21天 |LeetCode669. 修剪二叉搜索树 LeetCode108.将有序数组转换为二叉搜索树 LeetCode 538.把二叉搜索树转换为累加树

二叉树最后一天,进行了二叉搜索树的修改和构造,并做一些总结

2301_79647020的博客 932

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

代码随想录算法训练营第二十三天|Leetcode669 修剪二叉搜索树、Leetcode108 将有序数组转换为二叉搜索树、Leetcode538 把二叉搜索树转换为累加树

对于构建平衡的二叉搜索树,因为给定的数组按严格递增顺序排列,我们在构建二叉搜索树的过程中不需要担心太多,重点在于我们如何构建的二叉搜索树是平衡的?输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3。输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]

Demok123的博客 1192

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

代码随想录算法训练营第23天|669. 修剪二叉搜索树|108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树|总结篇

669. 修剪二叉搜索树这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。题目链接/文章讲解:https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html 视频讲解: https://www.bilibili.com/video/BV17P41177ud/*** int val;* };

2401_83080774的博客 1928

代码随想录算法训练营第十八天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

视频讲解:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com, 这里刷题顺序,详细题解,应有尽有!看一遍再也不会做错!,梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!,单调栈,经典来袭!LeetCode:42.接雨水,Manacher 马拉车算法【力扣周赛 420】,一台服务器究竟能干啥?

qq_73932604的博客 782

代码随想录算法训练营第十八天 | LeetCode669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树

学习了修剪二叉树的重要操作,复习将数组转化为二叉搜索树的操作以及将二叉搜索树转化为累加树

m0_67729424的博客 842

代码随想录算法训练营第21天 | 题目: 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

代码随想录。

weixin_51303606的博客 1128

代码随想录算法训练营第二十三天| LeetCode 669.修剪二叉搜索树 、LeetCode108.将有序数组转换为二叉搜索树、LeetCode538. 把二叉搜索树转换为累加树

说明当前节点需要删除,但是由于其孩子可能符合条件,因此应该继续向右遍历,用right接收返回值。说明当前节点需要删除,但是由于其孩子可能符合条件,因此应该继续向左遍历,用left接收返回值。调用递归函数,用root接收返回值,传入数组,0,数组的长度-1三个值,返回递归函数返回的值。递归调用递归函数,传入数组,左区间边界下标,和中间位置下标-1,用当前节点的左孩子接收。递归调用递归函数,传入数组,中间位置下标+1,右区间边界下标,用当前节点的右孩子接收。向右递归遍历,传入当前节点的右孩子。

m0_64514622的博客 1243

代码随想录算法训练营第十九天 |【二叉树】669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、二叉树总结

力扣题目链接(opens new window)给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L)。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。如果不对递归有深刻的理解,这道题目还是有难度的!在二叉树:构造二叉树登场!和二叉树:构造一棵最大的二叉树 (opens new window)之后,我们顺理成章的应该构造一下二叉搜索树了,一不小心还是一棵平衡二叉搜索树。

qq_43714515的博客 1091

代码随想录算法训练营第二十三天 | 669. 修剪二叉搜索树、 108.将有序数组转换为二叉搜索树、 538.把二叉搜索树转换为累加树

采用一种右中左的反向中序遍历,注意,这里与通常的左中右的遍历不同。在反向中序遍历的过程中,记录下前一个遍历到的节点pre,将当前节点node的值加上pre节点的值。类似地,如果想要求这样的累加树:每个节点node的新值等于原树种小于或等于node.val的值之和,可以采用正向的中序遍历来解决。因为题目给的是排好序的数组,且要求是一棵高度平衡的二叉搜索树,所以在每次递归的时候,找出当前范围。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。

owlmo的博客 1120

代码随想录算法训练营第十八天 | LeetCode669.修剪二叉搜索树、LeetCode108.将有序数组转换为二叉搜索树、LeetCode538.把二叉搜索树转换为累加树

题型关键理念二叉树的遍历前序、中序和后序;层序翻转二叉树前序、后序遍历对称二叉树遍历两棵树二叉树的最大深度、最小深度后序遍历完全二叉树的节点个数递归、通过2n-1优化平衡二叉树分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1二叉树的所有路径前序遍历、回溯左叶子之和当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和找树左下角的值找深度最大的叶子节点路径总和。

zhuabazhuabahuo的博客 916

二刷代码随想录算法训练营第二十三天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。所以结果应当返回修剪好的二叉搜索树的新的根节点。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。

magic2142028406的博客 1083

day21 | 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

*注意:**本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同。通过设置双指针,cur为遍历的当前节点,pre为当前节点的前一个节点,通过cur.val += pre;树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。将中间节点作为树的根节点,因为数组是有序的,左边为树的左子树,右边为树的右子树,最后返回树。给你二叉搜索树的根节点。

m0_65709641的博客 1013
上一篇: 代码随想录算法训练营第二十二天丨235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点
下一篇: 代码随想录算法训练营第二十四天丨回溯算法、77. 组合
LIEBESFREUD
博客等级 码龄9年 372粉丝 80原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值