代码随想录 Day 20 | 【第六章 二叉树part07】235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

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

一、235. 二叉搜索树的最近公共祖先

相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。

1. 找最近祖先

        (1)根据二叉搜索树的特性,中间节点一定大于其左子树所有值,一定小于右子树所有值。所以首先判断中间节点和p、q二者之间的大小,如果均大于中间节点,说明一定都在其右子树;反之,则都在左子树;如果一大一小,则在左右子树上。

        (2)如何判断是最近的祖先而不是次近的:如果继续向下遍历,p或q有一个消失的话,说明错过p或q,不能继续向下遍历了,当前的中间节点就是最近的祖先。

2. 代码实现

(1)定义递归函数,传入的是当前遍历的节点、p和q,返回值是节点。

(2)确定终止条件:首先本题不需要前中后序,只需要左和右即可,中间节点无需处理。

        1)如果当前节点的值大于p的值且大于q的值,说明p和q均在左子树上,所以向左去遍历搜索。终止条件就是当左为空,就返回节点。

        2)如果当前节点的值小于p的值且小于q的值,说明p和q均在右子树上,所以向右去遍历搜索。终止条件就是当右为空,就返回节点。

(3)剩下的情况就是节点在p和q之间,不需要去管谁大谁小,直接返回当前节点即可。

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

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root is None or root == p or root == q: 
            return root

        # left:
        if root.val > p.val and root.val > q.val:
            left = self.lowestCommonAncestor(root.left, p, q)
            if left is not None: 
                return left

        # right:
        if root.val < p.val and root.val < q.val:
            right = self.lowestCommonAncestor(root.right, p, q)
            if right is not None: 
                return right

        return root

二、701.二叉搜索树中的插入操作

本题比想象中的简单,大家可以先自己想一想应该怎么做,然后看视频讲解,就发现 本题为什么比较简单了。

1. 解题思路

        根据探究可以发现,任何一个要插入的节点都可以最终在某个叶子节点后插入,无需改变这颗二叉树的原始结构,这种做法是最简单的。

        注意:如果问题将二叉搜索树变成平衡二叉树,那么超过一定深度就需要改变树的结构。

(1)确定递归函数的参数和返回值:递归函数的参数为传入的二叉树根节点和需要插入节点的值,返回值是改变后的二叉树根节点。

(2)确定终止条件:

        递归遇到空,就终止递归,同时也找到了我们需要插入新节点的位置;所以定义一个新节点,传入数值,然后将这个新节点返回给上一个节点。

(3)如果当前节点的值大于新节点的值,那么向左去遍历,最后用root.left接住这个节点。 

(4)如果当前节点的值小于新节点的值,那么向右去遍历,最后用root.right接住这个节点。

(5)最后返回root即可。

2. 代码实现

# 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 insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if root is None:
            node = TreeNode(val)
            return node

        if root.val > val:
            root.left = self.insertIntoBST(root.left, val)
        if root.val < val:
            root.right = self.insertIntoBST(root.right, val)

        return root

三、450.删除二叉搜索树中的节点

相对于 插入操作,本题就有难度了,涉及到改树的结构

1. 分析五种情况

所需删除的节点位置一共分以下五种情况: 

(1)左子树和右子树均为空:说明需要删除的是叶子节点

(2)左子树为空和右子树不为空:直接将右子树的父节点改成待删除的节点的父节点

(3)右子树为空和左子树不为空:直接将左子树的父节点改成待删除的节点的父节点

(4)左子树和右子树均不为空:根据二叉搜索树的特性,将左子树的最大值(即左子树的根节点)连接到右子树的最小值(即右子树最左侧的叶子节点)下面。

(5)没找到需要删除的根节点。

2. 代码实现

(1)定义递归函数的参数和返回值:传入参数二叉搜索树根节点,以及需要删除的节点值,返回的是更新后的二叉树根节点。

(2)确定终止条件:即找到需要删除的节点值就终止递归,进行删除操作。

        1)没有找到待删除节点/该二叉树为空:返回null。

        2)找到待删除节点:

                A. 如果待删除节点为叶子节点:即左右子树均为空,那么进行删除节点操作,直接返回null,也就是将null返回给了叶子节点的父节点。

                B. 如果待删除节点左不为空而右为空:返回左子树,也就是将左子树返回给了待删除节点的父节点。

                C. 如果待删除节点左为空而右不为空:返回左子树,也就是将右子树返回给了待删除节点的父节点。

                D. 如果待删除节点左右均不为空:即需要将左子树的根节点移动到右子树的最左侧的叶子节点下面。a. 首先定义cur指针指向待删除节点,然后对右子树一直进行向左遍历,直到来到其最左侧的叶子节点; b.然后将待删除节点的左子树移动到该叶子节点;c.删除待删除节点:让待删除节点的父节点直接指向右子树的根节点即可,在此处我们直接返回右子树给父节点。

(3)单层递归逻辑:

        1)根据二叉搜索树的特性,如果root.val大于key,那么直接向左递归,注意递归函数有返回值,所以需要root.left接住;

        2)根据二叉搜索树的特性,如果root.val小于key,那么直接向右递归,注意递归函数有返回值,所以需要root.right接住;

(4)最后返回root。

# 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 deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        # 确定递归的终止条件——找到待删除节点:
        if root is None:
            return None

        if root.val == key:
            # 待删除节点是叶子节点:
            if root.left is None and root.right is None:
                return None
            elif root.left is not None and root.right is None:
                return root.left
            elif root.left is None and root.right is not None:
                return root.right
            else: # 待删除节点左右子树均不为空
                cur = root.right
                while cur.left:
                    cur = cur.left
                cur.left = root.left
                return root.right

        # 确定单层递归条件:
        if root.val > key:
            root.left = self.deleteNode(root.left, key)
        if root.val < key:
            root.right = self.deleteNode(root.right, key)
        return root
                

Ollama-OCR实战:5分钟搞定PDF文档转Markdown(附qwen2.5vl模型配置) 本文详细介绍了如何利用Ollama本地部署多模态大模型qwen2.5vl,结合OCR技术,实现PDF文档到Markdown的端到端智能转换。通过解析传统OCR的局限与AI方案的优势,并提供从环境搭建、提示词工程到处理复杂表格的完整实战指南,帮助用户高效构建自动化文档处理流水线,彻底重塑文档处理工作流。 阅读详情

相关推荐

从电商平台到微信私域:构建合规跳转链路的技术实现

在互联网营销与用户增长领域,链接跳转是连接不同平台、引导用户流量的基础技术。其核心原理是通过服务器端路由与参数解析,实现用户请求的接收、处理与重定向。这项技术的价值在于能够突破平台间的生态壁垒,实现流量的合规、可控迁移,尤其适用于跨平台营销、私域沉淀等场景。在实际应用中,常需处理微信环境限制、参数传递与动态内容生成等挑战。本文聚焦于电商平台(如淘宝)到微信生态的跳转需求,详细阐述了如何利用Node.js、Express框架及二维码生成技术,构建一个包含环境检测、参数传递与动态落地页的完整跳转系统,以解决微信

weixin_33889665的博客 323

代码随想录算法训练营day20(python版)|第六章 二叉树part07|235. 二叉搜索树的最近公共祖先·701.二叉搜索树中的插入操作·450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。在 BST 中:对任意节点root,有。给定p与q若二者都root.val,LCA 一定位于;若二者都root.val,LCA 一定位于;否则(分居两侧或其中一个就是root),root。时间复杂度O(h),空间:递归O(h)/ 迭代O(1)h为树高,平衡树约log n,最坏退化为n。

qq_43752779的博客 454

MiniMaxH3+ComfyUI本地部署:一键整合包、工作流搭建与报错排查

本地部署视频生成模型时,模型权重、推理框架与自定义节点的匹配是核心挑战。MiniMaxH3作为多模态生成模型,通常依赖ComfyUI这类节点式工作流引擎实现可视化调度。一键整合包将Python环境、PyTorch算子、模型文件预置封装,大幅降低部署门槛,并通过半精度加载、显存碎片回收等机制优化推理速度。在文生视频、图生视频与批量生成场景中,清晰的节点链路和参数调优能力直接影响输出质量与显存占用。针对模型不识别、节点执行失败等高频问题,系统排查命令行日志与模型目录可快速定位故障。本文以MiniMaxH3整合包

weixin_29047545的博客 582

【LeetCode题目详解】第六章 二叉树part08 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 (day22补)

对于二叉搜索树的最近祖先问题,其实要比普通二叉树公共祖先问题简单的多。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。首先在二叉搜索树中的插入操作,大家不用恐惧其重构搜索树,其实根本不用重构。然后在递归中,我们重点讲了如何通过递归函数的返回值完成新加入节点和其父节点的赋值操作,并强调了搜索树的有序性。

weixin_67972246的博客 856

基于分位数回归的静态CoVaR计算 案例与代码

原文链接:https://bbs.pinggu.org/thread-7925441-1-1.html 一、静态CoVaR模型介绍 二、资料简介 实现对相关期刊论文进行论文重现,解决实证分析中的技术操作问题。里面包含了每一步详细的步骤,可以方便的利用这个手册解决大部分利用分位数回归计算静态CoVaR的论文的模型实现问题。即从数据下载到模型实现一整条操作步骤。 关键词:【分位数回归】【Co...

ChenQihome9的博客 7504

电蚊拍为什么能秒杀蚊子?深入解析两种四倍压整流电路设计差异

本文深入解析电蚊拍秒杀蚊子的核心原理——四倍压整流电路设计,对比对称式与级联式两种方案的性能差异。通过详细电路分析、实测数据对比和选型建议,揭示高压电路设计的关键技术要点,为电子爱好者和工程师提供实用参考。

rust6ferris的博客 750

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

● 235. 二叉搜索树的最近公共祖先● 701.二叉搜索树中的插入操作● 450.删除二叉搜索树中的节点递归迭代思路题解递归迭代相对于 插入操作,本题就有难度了,涉及到改树的结构思路题解。

weixin_60315213的博客 1099

JESD204B Subclass 1的SYSREF机制

SYSREF 是一个系统级同步脉冲信号,用于对齐 JESD204B 中的 LMFC(Local Multi-Frame Clock),从而实现每次建链的延迟一致性。核心点内容说明是系统参考跨多个芯片、多通道实现精确同步控制 LMFC决定所有设备的 LMFC 对齐点仅用于 Subclass 1是 JESD204B 实现确定性延迟的前提条件一般通过时钟芯片生成推荐使用 AD9528、LMK04828,支持 JESD204 专用输出建链过程中关键作用。

weixin_41230430的博客 1829

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

这道题明晃晃就要是要利用二叉搜索树的节点大小的特点,如果当前节点的值比这两个的都要大,那就往左边找(单独左子树递归即可),如果当前的值比这两个的值都要小那就往右边找(单独右子树递归即可),如果恰好处于中间的一个值,那就证明当前节点就是最近公共祖先,然后返回给上个节点的递归即可(这么找上个节点必然是这个节点的父母节点,所以必然比这两个数都大或小),再直接返回找到的结果即可——首先要找到要删除的目标节点,然后再把删除节点之后的子树移接到它的父母节点,如果没有父母节点,就直接返回删除后的子树。

mrmobi的博客 1130

避坑指南:CentOS7.9安装Python3.8.16后yum报错的快速修复方法

本文详细解析了在CentOS7.9系统安装Python3.8.16后导致yum报错的原因,并提供了快速修复方法。通过修改yum配置文件指向Python2解释器,以及使用alternatives工具管理多版本Python,有效解决兼容性问题。同时推荐使用虚拟环境隔离开发环境,避免影响系统稳定性。

weixin_26908317的博客 496

EFR32BG22 Thunderboard开发板 使用SPI 读取加速度计

Simplicity Studio v5 创建Silicon Labs蓝牙SoC EFR32BG22 Thunderboard模块的加速度计工程,模块上有一个ICM-20648 6轴运动跟踪设备,集成3轴加速度计和3轴陀螺仪功能,使用SPI接口跟EFR32BG22芯片连接。 我尽量以图片的形式展示(少打字): 将EFR32BG22的Thunderboard模块通过USB线插入到电脑,打开Simplicity Studio v5软件。 下面看重点: 点击搜索到的IO Stream: USART,点击Ins

qq_25727979的博客 1494

Day20 第六章 二叉树part08

3.被删除节点有两个子节点:找到右子树中的最小值节点(即右子树中最左边的节点),将当前节点的左子树接到右子树的最小值节点的左子树上得到新右子树。终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。利用二叉搜索树的性质:左子树的所有节点值 < 当前节点值 < 右子树的所有节点值。因为这是搜索树,搜索树是有方向的,可以根据插入元素的数值,决定递归方向。2.被删除节点只有一个子节点:删除该节点,并用其子节点替换它。分别位于当前节点的两侧时,当前节点就是它们的最低公共祖先。

Takagi1_san的博客 1188

YOLOv8 道路病害检测全栈工程|22 类路面裂缝坑洞 VOC&YOLO 数据集、PyQt 精美 GUI、ONNX 量化、全套训练评估曲线落地

城市道路、国省道、高速公路路面长期受车辆碾压、雨水侵蚀,衍生纵向 / 横向裂纹、坑洼、车辙、接缝剥落等二十余种路面病害。传统人工道路巡检存在致命行业痛点:人工徒步 / 乘车目视巡检效率极低,单日有效巡查里程不足 20 公里;毫米级细微线性裂纹肉眼极易漏检,雨水冲刷后微小病害快速扩张为大坑槽,养护成本翻倍;强光暴晒、阴雨积水、路面油污场景人工分辨难度大;海量巡检图片人工分类统计病害台账耗时数天,养护决策缺乏量化数据支撑。传统阈值、边缘检测图像处理仅能识别大面积坑洞,无法区分二十余种细分裂纹类型,泛化能力极差。

getusushu的博客 122

day 22 第六章 二叉树[数学公式]part08 ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。如图,我们从根节点搜索,第一次遇到 cur节点是数值在[q, p]区间中,即 节点5,此时可以说明 q 和 p 一定分别存在于 节点 5的左子树,和右子树中。将删除节点(元素7)的左孩子放到删除节点(元素7)的右子树的最左面节点(元素8)的左孩子上,就是把5为根节点的子树移到了8的左孩子的位置。动画中的二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。如果找到了,删除它。

mest_gg的博客 108

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

算法训练营DAY20 第六章 二叉树part07

当root的值比p、q的值都大,就向左递归,用left接收返回值,当left不为空,就return left;当root的值比p、q的值都小,就向右递归,用right接收返回值,当right不为空,就return right;当root的值大于val,向左递归,用root->left接收返回值(node);5)左右孩子都不为空,将左子树的头结点(左孩子)放到右子树最左的节点的左孩子的位置。3)左孩子为空,右孩子不为空,删除节点,右孩子补位;4)右孩子为空,左孩子不为空,删除节点,左孩子补位;

2401_89133587的博客 265

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

代码随想录 day17:第六章 二叉树 part07

第六章 二叉树part07 235. 二叉搜索树的最近公共祖先701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点 ) 235. 二叉搜索树的最近公共祖先 相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

z25735的博客 266

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

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

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

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

2401_88089822的博客 409

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

今日内容:● 235. 二叉搜索树的最近公共祖先● 701.二叉搜索树中的插入操作● 450.删除二叉搜索树中的节点。

jtzdgzlm的博客 187

day22||第六章 二叉树part08: ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

第一个方法就是用d21类似题目的方法,有通用性,第二个方法就是利用了二叉搜索树的特性。

xburner01的博客 174

第六章 二叉树 part08

3道题目。

wxw154170875的博客 120

day20 第六章 二叉树part07

通过递归函数的返回值完成其父节点的赋值操作。二叉树本质是链表,插入删除要记前后节点。235. 二叉搜索树的最近公共祖先。450.删除二叉搜索树中的节点。701.二叉搜索树中的插入操作。

mvufi的博客 330

算法训练营Day22 第六章 二叉树part8

情况⑤稍微复杂一些,我们可以考虑让右孩子来替代被删除的节点,同时再让左子树的部分成为右子树中最左侧的节点的左子树。②要删除的节点为叶子节点;④要删除的节点左孩子不为空,右孩子为空;这道题同样应该想到运用二叉搜索树的特性来解题,并且可以发现,在叶子节点插入节点就可以满足题意。当插入值小于当前比较节点的值时,就向当前节点的左子树一侧遍历,反之则向右子树一侧遍历。这道题与昨天的最后一题比较相似,但相比于上一题,这道题可以利用二叉搜索树的特性(左子树上的值都比该节点的小,右子树上的值都比该节点的大)。

minatozaki98的博客 178

视频隐私脱敏工程化: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

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20
上一篇: 代码随想录 Day 18 | 【第六章 二叉树 part06】530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
下一篇: 代码随想录 Day 27 | 【第六章 二叉树part 08】669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值