代码随想录 Day 27 | 【第六章 二叉树part 08】669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

一、669. 修剪二叉搜索树

这道题目比较难 ,比 添加增加和删除节点难的多,建议先看视频理解。

1. 常见误区及代码

        常见的错误思路是判断节点值是否在区间范围内,如果不在范围内,直接返回null,砍掉了这颗节点及其下方的树。

       然而,需要注意的是,这是一颗二叉搜索树,如果节点值不在范围,那么应该删除的是节点及其左子树,而它的右子树还需要继续遍历,看是否有满足条件的。

2. 正确的代码实现

(1)确定递归函数的参数和返回值:参数是根节点、左区间、右区间,返回的是修建后树的根节点。

(2)确定终止条件:根节点为空,直接返回null。

        如果当前节点的值是小于左区间的,那么它的右子树可能存在满足范围的元素,所以需要在这个节点的右子树去遍历,最后返回新右子树的根节点。

        如果当前节点的值是大于右区间的,那么它的左子树可能存在满足范围的元素,所以需要在这个节点的左子树去遍历,最后返回新左子树的根节点。

(3)确定单层递归:根节点的左子树=向左递归,根节点的右子树=向右递归。

(4)最后返回根节点。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if root is None:
            return None

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

        root.left = self.trimBST(root.left, low, high)
        root.right = self.trimBST(root.right, low, high)
        
        return root

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

本题就简单一些,可以尝试先自己做做。

1. 题意

(1)为什么一定要构造成平衡二叉搜索树?

        因为任何一个有序数组,都可以将其构造为一个链式的二叉搜索树(相当于一条斜线),且满足二叉树的特性,那么本题将没有意义。

2. 整体思路

        找到数组的中间点,构造左区间和右区间,递归左区间构造为左子树,递归右区间构造为右子树。也就是数组的中点作为树的中节点,这样才能保证二叉树是平衡的。

        如果数组是偶数,那么取左侧/右侧节点作为中节点都可以;如果数组是奇数,那么直接取中间节点。

3. 代码实现

(1)定义递归函数的返回值和参数:传入数组、左区间点和右区间点(数组下标),返回值为根节点。此处需要注意区间的开闭,我们在这里定义为左闭右闭。

(2)确定终止条件:如果左区间大于右区间,就是非法区间,返回None;而左区间等于右区间不是非法区间,因为我们定义的是左闭右闭。

(3)单层递归的处理逻辑:

        首先找到中间值下标等于左区间+右区间除以2,注意要采用left+(right-left)//2的写法,否则容易超出内存。接下来构造根节点,传入中间节点的数值。

        递归左子树,传入的右区间是middle-1,因为我们定义的是闭区间。

        递归左子树,传入的左区间是middle+1,因为我们定义的是闭区间。

(4)返回根节点。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildTree(self, nums, left, right)->Optional[TreeNode]:

        if left > right: 
            return None

        mid = left + (right - left) // 2
        root = TreeNode(nums[mid])

        root.left = self.buildTree(nums, left, mid-1)
        root.right = self.buildTree(nums, mid+1, right)

        return root

    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        root = self.buildTree(nums, 0, len(nums)-1)
        return root

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

本题也不难,在 求二叉搜索树的最小绝对差 和 众数 那两道题目 都讲过了 双指针法,思路是一样的。

1. 解题思路

理解题意:

        本题是一棵二叉搜索树,例如下图,节点顺序就是二叉搜索树的遍历顺序(左中右),题目要求每个节点值等于节点顺序大于等于它的节点值之和。比如节点5,它的值就等于节点6、7、8的值之和,也就是节点6的值加上节点5本身。

整体思路:整体的遍历顺序是右中左,采用双指针的思路,定义一个cur指针指向当前节点,pre指针指向前一个节点,然后当前节点的值就等于前一个节点的值加当前的值。

2. 代码实现

(1)定义pre表示前一个节点的值,由于从树最右边的节点开始,所以cur一开始指向的就是树最右边的叶子节点,而其前一个节点不存在,所以pre初始化为0,这样cur就等于0加上本身就等于本身的值。

(2)定义函数的参数和返回值,由于本题是遍历这棵二叉树并更新节点的值,所以本题不需要返回值,传入树的根节点。

(3)确定终止条件:遇到空节点就返回空。

(4)单层递归逻辑:遍历顺序-右中左。

        1)右:先向右子树进行递归;

        2)中:将当前节点的值加上前一个节点的值,也就是pre+cur.val,就将当前节点值更新了,然后将当前节点的新值赋给pre;

        3)左:向左子树进行递归。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def __init__(self):
        self.pre = 0

    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root is None:
            return root

        # right:
        self.convertBST(root.right)

        # middle:
        root.val += self.pre
        self.pre = root.val

        # left:
        self.convertBST(root.left)
        
        return root

四、二叉树总结

好了,二叉树大家就这样刷完了,做一个总结吧
  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

  • 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,二叉树:找所有路径 (opens new window)也用了前序,这是为了方便让父节点指向子节点。

COMSOL+AI实战:5个超实用技巧让你的仿真效率翻倍(附Python代码) 本文详细介绍了如何将人工智能(AI)与COMSOL仿真软件结合,通过Python脚本实现五大实用技巧,包括自动化生成数据集、构建代理模型、集成AI优化算法、利用神经网络加速场量求解以及智能结果分析,从而显著提升多物理场仿真的效率和自动化水平。 阅读详情

相关推荐

AI影像组学在结直肠癌诊疗中的应用:从特征提取到临床决策

影像组学通过高通量计算从医学影像中提取定量特征,揭示肿瘤内部的微观生物学行为,这些特征反映了纹理异质性、形状不规则度等影像表型。其核心原理在于将图像数据转化为可分析的数字特征,结合机器学习算法进行模式识别,从而实现对疾病状态的精准预测。这一技术的价值在于能够无创、定量地评估肿瘤特性,为精准医疗提供关键支持。在临床实践中,AI驱动的影像组学模型广泛应用于结直肠癌的诊疗全链条,包括肿瘤良恶性鉴别、基因突变预测、治疗反应评估和预后分析等场景。通过整合影像组学特征与临床数据,可以构建预测模型,辅助医生进行更准确的诊

weixin_28295799的博客 409

代码随想录 day23 第六章 二叉树part09

● 108.将有序数组转换为二叉搜索树。● 538.把二叉搜索树转换为累加树。● 669. 修剪二叉搜索树。递归 [ 双指针法 ]

weixin_60315213的博客 1075

MDT部署实战:除了Office,这些“装机必备”软件也能一键静默安装(含静默参数)

本文详细介绍了如何利用Microsoft Deployment Toolkit(MDT)实现企业级软件的静默安装,包括浏览器、开发工具和系统增强工具等“装机必备”软件的部署方案。通过命令行参数和MSI属性,IT运维团队可以高效构建标准化工作环境,提升部署效率并确保版本一致性。文章还提供了安装顺序控制、结果验证和常见问题排错等高级技巧。

weixin_26985923的博客 172

【LeetCode题目详解】第六章 二叉树part09 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 (day23补)

修剪二叉搜索树其实并不难,但在递归法中大家可看出我费了很大的功夫来讲解如何删除节点的,这个思路其实是比较绕的。最终的代码倒是很简洁。如果不对递归有深刻的理解,这道题目还是有难度的!本题依然给出递归法和迭代法,初学者掌握递归就可以了,如果想进一步学习,就把迭代法也写一写。在二叉树:构造二叉树登场!和二叉树:构造一棵最大的二叉树之后,我们顺理成章的应该构造一下二叉搜索树了,一不小心还是一棵平衡二叉搜索树。其实思路也是一样的,不断中间分割,然后递归处理左区间,右区间,也可以说是分治。

weixin_67972246的博客 879

100道测试工程师笔试的Linux笔试题及答案_网络安全工程师关于linux的笔试大题

47.Linux系统中,一般把命令 ls 定义为 ls --color 的别名,以便以不同颜色来标识不同类型的文件。但是,如何能够使用原先的ls命令?83.在xdm的配置目录中,哪个文件用来设置在用户通过xdm登录后自动起动的应用程序?45.你的系统使用增量备份策略,当需要恢复系统时,你需要按什么顺序恢复备份数据?84.命令 netstat -a 停了很长时间没有响应,这可能是哪里的问题?51.Linux中,提供TCP/IP包过滤功能的软件叫什么?88.TCP/IP中,哪个协议是用来进行IP自动分配的?

2401_84247760的博客 1054

华为OD机试2025C卷真题题库目录|机考题库 + 算法考点详解

本文整理华为OD 2025C卷 机试(机考)题库,提供高频考点精析与详细题目内容,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 3988

代码随想录算法训练营day21(python版)|第六章 二叉树part08|669. 修剪二叉搜索树`108.将有序数组转换为二叉搜索树`538.把二叉搜索树转换为累加

669. 修剪二叉搜索树这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。

qq_43752779的博客 568

OpenClaw进阶实战(二十一):工作流6:跨平台舆情监控与自动响应

摘要: 本文介绍基于OpenClaw构建自动化舆情监控系统,实现多平台数据采集、AI情感分析与智能预警。系统架构包含数据采集(微博/小红书/抖音)、消息队列、情感分析(SnowNLP/大模型API)、分级预警和自动响应模块。通过技能化开发(如微博API采集、小红书模拟登录)实现7×24小时监控,结合情感强度与传播速度分级处理负面舆情,形成"采集-分析-预警-处置"闭环,适用于企业私有化部署。

PeterPan的博客 299

Day21 第六章 二叉树part09

删除二叉树节点,增加二叉树节点,都是用递归函数的返回值来完成,这样是比较方便的。再来看参数,首先是传入数组,然后就是左下标left和右下标right,在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组。这里定义的是左闭右闭区间[left, right],所以当区间 left > right的时候,就是空节点了。接着划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点。注意要右中左来遍历二叉树, 中节点的处理逻辑就是让cur的数值加上前一个节点的数值。

Takagi1_san的博客 1090

【异常】Cursor编辑器 “Taking longer than expected...“ 报错全链路排查与解决方案

该提示并非传统的程序崩溃或语法报错,本质是Cursor编辑器的超时预警机制——当核心任务(云端AI推理请求、本地项目索引等)的执行耗时超出系统预设阈值时,触发的用户告知类提示,核心诱因是任务执行全链路出现阻塞或性能瓶颈。以下方案按排查优先级从高到低排序,覆盖从快速急救到根因根治的全流程,可按步骤逐步验证解决。针对大仓库、多依赖项目的索引超时问题,核心是通过规则过滤无效文件,从根源降低索引负载。

奶爸的编程之路,也就一周冷个三天 3101

IMX335摄像头原理图设计,已量产

从工程组织上看,IMX335 模组和 IMX415 模组属于同一类产品:核心矛盾不是外设多,而是高速图像链路、电源域和调试接口要同时兼顾。ATK-MCIMX335 这张图的结构也很直接,三路 LDO、本地 24MHz 可选时钟、4-lane MIPI 数据对和一组主板侧标准接口,构成了一张非常典型的量产摄像头子板。

不脱发的程序猿 439

day23 | 第六章 二叉树part09 ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇

在。

mest_gg的博客 135

【Matlab光伏功率预测】基于GRU门控循环单元的光伏功率时间序列预测(附MATLAB代码)

【Matlab光伏功率预测】基于GRU门控循环单元的光伏功率时间序列预测(附MATLAB代码)

k8291121的博客 1100

【随想录】Day23—第六章 二叉树part09

改题目的思路类似于删除 BST 中的结点的思路。借助双指针的思想来实现。

weixin_44382896的博客 383

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

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【代码随想录算法训练营14期】- day 23 第六章 二叉树part09

今日内容:● 669. 修剪二叉搜索树● 108.将有序数组转换为二叉搜索树● 538.把二叉搜索树转换为累加树● 总结篇。

jtzdgzlm的博客 361

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

算法训练营DAY21 第六章 二叉树part08

如果当前结点的值小于下限,那么需要向该节点的右儿子递归,为了看右儿子是否有在区间内的部分,并返回满足区间的子树根节点;如果当前值大于上限,就需要向该节点的左儿子递归,为了看左儿子满足区间的部分,并返回满足区间的子树根节点;按照右中左的顺序遍历,先找到最右边的最大的元素,用pre记录这个最大元素,上一层递归会把这个值加到上一层的root节点,实现层层累加。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

2401_89133587的博客 302

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

day 23 第六章 二叉树part09

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

jbjhzstsl的博客 373

day23||第六章 二叉树part09● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇

没做。。。。。。

xburner01的博客 264

代码随想录 day18:第六章 二叉树 part08

第六章 二叉树part08 669. 修剪二叉搜索树108.将有序数组转换为二叉搜索树538.把二叉搜索树转换为累加树 ) 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

z25735的博客 345

代码随想录算法训练营DAY21第六章 二叉树part08

【代码】代码随想录算法训练营DAY21第六章 二叉树part08。

2401_88089822的博客 353

Day 22 第六章 二叉树 part09

3道题目。

wxw154170875的博客 176

day21 第六章 二叉树part08

二叉树的增加/删除,用有返回值的函数更方便,要记得上一层有结点接住本层的返回值。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。669. 修剪二叉搜索树。

mvufi的博客 269

算法训练营Day23 第六章 二叉树part9

当root->val < low的时候,该节点以及该节点左子树上的值都不在区间内,而右子树上的值仍有可能在区间内,因此继续遍历右子树上的节点,并返回,上一层递归函数会接收到返回值;同理当root->val > high时,该节点以及右子树上的值都不在区间内,左子树上的值有可能在区间内,因此去遍历左子树上的节点,并返回结果。的顺序来遍历整颗二叉搜索树,这种方法能够很好的利用二叉搜素树的特性,即:每次遍历时得到的都是未遍历过的节点中的最大值,再设置一个。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

minatozaki98的博客 197

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 218

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 314

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 590
上一篇: 代码随想录 Day 20 | 【第六章 二叉树part07】235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
下一篇: 代码随想录 Day 28 | 【第七章 回溯算法part 01】理论基础、77. 组合、216.组合总和III、17.电话号码的字母组合
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值