代码随想录算法训练营第22天|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

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

思路:这题可以利用二叉搜索树的特性能更明确的去左右方向找pq。所以什么遍历顺序都可以。

如果pq的值都小于root值,说明pq一定在左子树,去左子树遍历。

如果pq的值都大于root值,则在右子树。

排除以上两种情况,最后一种情况就是pq分别在root左右两侧。此时root一定是pq的最近公共祖先。因为如果往左遍历会错过右子树的节点,往右错过左。

优化:若p为q的父节点就直接返回该节点,if(root==p ||root==q)可以不写,把return root写在所有情况的最后面,这样可以涵盖到pq在root左右两侧和p在q的上面这两种情况。

代码:

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == NULL) return NULL;
        if(root == p || root == q) return root;

        //左
        if(root->val > p->val && root->val > q->val){
            TreeNode* left = lowestCommonAncestor(root->left,p,q);
            if(left!=NULL) return left;
        }
        //右
        if(root->val < p->val && root->val < q->val){
            TreeNode* right = lowestCommonAncestor(root->right,p,q);
            if(right!=NULL) return right;
        }
        //中,这种情况pq分别在root左右两边
        return root;
    }

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

思路(递归法):按二叉搜索树特性找到插入位置插入即可,需要考虑到树是空的话,直接插入为根节点。

代码:

void insertnode(TreeNode* node,int val){
        if(node == nullptr) return;
        if(node->val > val){
            insertnode(node->left,val);
            if(node->left == nullptr){
                node->left = new TreeNode(val);
                return;
            }
        }
        if(node->val < val){
            insertnode(node->right,val);
            if(node->right == nullptr){
                node->right = new TreeNode(val);
                return;
            }
        }
    }
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root != nullptr){
            insertnode(root,val);
        }else{//当前树为空,直接插入为根节点
            root = new TreeNode(val);
        }
        return root;
    }

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

删除节点的情况分别为5种:

情况1:要删除的节点在树中找不到,遍历后返回空

情况2:要删除的节点左右孩子都为空(叶节点),直接删除该节点,返回null

情况3:要删除的节点左孩子为空,右孩子不为空,把右孩子补到删除节点的位置,然后返回右孩子(删除了节点)。

情况4:要删除的节点左孩子不为空,右孩子为空,把左孩子补到删除节点位置,返回左孩子(和情况3处理规则一样)。

情况5:要删除的节点左右孩子都不为空,cur找到右子树最左下的节点(右子树最小的节点),把要删除节点的左子树移接到cur的左侧,再把要删除的节点的右孩子返回上层。

代码:

TreeNode* deleteNode(TreeNode* root, int key) {
        //终止条件,删除节点的情况分类
        if(root == NULL) return NULL;//情况1
        if(root->val == key){
            if(root->left==NULL && root->right==NULL) return NULL;//情况2,这层root是要删除的节点,返回NULL,上层左孩子或者右孩子就是NULL
            else if(root->left==NULL && root->right!=NULL) return root->right;//情况3  
            else if(root->left!=NULL && root->right==NULL) return root->left;//情况4    
            else if(root->left!=NULL && root->right!=NULL){//情况5
                TreeNode* cur = root->right;
                while(cur->left != NULL)//cur找到root右子树最左下角的节点即右子树的最小值
                    cur = cur->left;
                //把root的左子树放到cur的左子树中,所以root左子树都比cur值小
                cur->left = root->left;
                return root->right;
            } 
        }
        //遍历,找到目标节点
        if(root->val > key) root->left = deleteNode(root->left,key);
        if(root->val < key) root->right = deleteNode(root->right,key);
        return root;
    }

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

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

相关文章

金蝶云星空使用插件打开单据列表

文章目录 金蝶云星空使用插件打开单据列表核心代码操作测试 金蝶云星空使用插件打开单据列表 核心代码 表单插件-按钮点击事件 ListShowParameter showParam new ListShowParameter();showParam.IsLookUp false;//是否查找数据showParam.OpenStyle.ShowType ShowType.Moda…

【SQL注入】靶场SQLI DUMB SERIES-24通过二次注入重置用户密码

先使用已知信息admin/admin登录进去查下题&#xff0c;发现可以修改密码 猜测可能存在的SQL语句&#xff1a;UPDATE user SET password新密码 WHERE user用户名 and password旧密码 假设我们知道有个admin用户&#xff0c;但是不知道其密码&#xff0c;如何可以将其密码重置&…

费舍尔FISHER金属探测器探测仪维修F70

美国FISHER LABS费舍尔地下金属探测器&#xff0c;金属探测仪等维修&#xff08;考古探金银铜探宝等仪器&#xff09;。 费舍尔F70视听目标ID金属探测器&#xff0c;Fisher 金属探测器公司成立于1931年&#xff0c;在实验条件很艰苦的情况下&#xff0c;研发出了地下金属探测器…

Elasticsearch Update By Query详解

1. 使用场景 一般在以下几种情况时&#xff0c;我们需要重建索引&#xff1a; 索引的 Mappings 发生变更&#xff1a;字段类型更改&#xff0c;分词器及字典更新 索引的 Setting 发生变更&#xff1a;索引的主分片数发生改变 集群内&#xff0c;集群间需要做数据迁移 Elastiic…

【AIGC】基于深度学习的图像生成与增强技术

摘要&#xff1a; 本论文探讨基于深度学习的图像生成与增强技术在图像处理和计算机视觉领域的应用。我们综合分析了主流的深度学习模型&#xff0c;特别是生成对抗网络&#xff08;GAN&#xff09;和变分自编码器&#xff08;VAE&#xff09;等&#xff0c;并就它们在实际应用中…

电商平台商家结算

本文主要分析了目前电商清结算的流程以及自己对电商清结算的看法。 基本概念 先说下电商平台清结算的概念。简单说就是收的用户&#xff08;C端&#xff09;的付款&#xff0c;经过清分&#xff0c;再结算给对应商家。当然&#xff0c;这里排除那种资金不通过第三方&#xff0c…

一线城市打工人的大龄焦虑:都市容不下躯壳,老家容不下灵魂(含华为 OD 面试原题)

互联网的大龄焦虑 今天看到一个老生常谈的话题「大龄焦虑&#xff1a;都市容不下躯壳&#xff0c;老家容不下灵魂」。 现如今&#xff0c;内卷已不是互联网行业专属名称&#xff0c;早已渗透到一线城市中的各行各业。 但地域落差对职业的影响&#xff0c;互联网行业还是稳稳的位…

【SpringCloud】使用 Spring Cloud Alibaba 之 Sentinel 实现微服务的限流、降级、熔断

目录 一、Sentinel 介绍1.1 什么是 Sentinel1.2 Sentinel 特性1.3 限流、降级与熔断的区别 二、实战演示2.1 下载启动 Sentinel 控制台2.2 后端微服务接入 Sentinel 控制台2.2.1 引入 Sentinel 依赖2.2.2 添加 Sentinel 连接配置 2.3 使用 Sentinel 进行流控&#xff08;含限流…

【SAP Hana】SAP S/4 HANA 数据库底表查询及运维管理

1、SAP S/4 HANA 简介 1.1 S4与ECC的区别 SAP ECC时期支持常规主流的关系型数据库&#xff0c;如MSSQL、ORACLE、IBM DB2等。 SAP S4 仅支持在HANA数据库上运行。 SAP基于HANA的内存计算、列式存储&#xff0c;以及并行计算特性&#xff0c;对SAP数据底表做了大量的改造优化&am…

java.lang.IllegalStateException: Promise already completed.

spark submit 提交作业的时候提示Promise already complete 完整日志如下 File "/data5/hadoop/yarn/local/usercache/processuser/appcache/application_1706192609294_136972/container_e41_1706192609294_136972_02_000001/py4j-0.10.6-src.zip/py4j/protocol.py"…

【2024软件测试面试必会技能】Jmeter_性能测试(5):负载测试和压力测试

负载测试 负载测试/容量测试&#xff1a;通过在测试过程中不断的调整负载&#xff0c;找到在多少用户量情况下&#xff0c;系统出现性能下降拐点&#xff1b;也被称为容量测试&#xff1b; 举例&#xff1a; 微信发送红包的负载测试&#xff1a; 1、找运维人员了解目前系统…

多普勒明渠流量监测系统

TH-ML1随着科技的不断进步&#xff0c;多普勒明渠流量监测系统作为一种先进的流量测量技术&#xff0c;正逐渐在水利、环保、农业等领域展现出其强大的应用潜力。 一、多普勒明渠流量监测系统的基本原理 多普勒明渠流量监测系统基于多普勒效应进行流量测量。多普勒效应是指当波…

C#,数值计算,矩阵的乔莱斯基分解(Cholesky decomposition)算法与源代码

一、安德烈路易斯乔尔斯基 安德烈路易斯乔尔斯基出生于法国波尔多以北的查伦特斯海域的蒙古扬。他在波尔多参加了Lyce e&#xff0c;并于1892年11月14日获得学士学位的第一部分&#xff0c;于1893年7月24日获得第二部分。1895年10月15日&#xff0c;乔尔斯基进入莱科尔理工学院…

SQL Server ID 自增不连续、删除数据后再次插入ID不连续

背景 当我们使用SQL Server 进行数据库操作时&#xff0c;经常会把 Table 的 ID 设置成主键自增 PRIMARY KEY IDENTITY&#xff0c;但是这样做存在一个问题就是 当我们删除一行数据后&#xff0c;再次添加后会看到ID的顺序不连续&#xff0c;如下所示。 查询一下&#xff1a;…

4.pom文件介绍Maven常用命令

1.pom.xml文件介绍. 1.1project标签和modelVersion标签介绍. pom.xml文件是maven的核心文件&#xff0c;POM(Project Object Model&#xff0c;项目对象模型)定义了项目的基本信息&#xff0c;用于描述如何构建&#xff0c;声明项目依赖;&#xff1b; 1.2依赖坐标介绍. 依赖的…

Springboot集成Druid实现监控功能

Druid是阿里巴巴开发的号称为监控而生的数据库连接池&#xff0c;在功能、性能、扩展性方面&#xff0c;都超过其他数据库连接池&#xff0c;包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等&#xff0c;秒杀一切。Druid可以很好的监控DB池连接和SQL的执行情况&#…

STM32G030C8T6:定时器1ms中断(以64MHz外部晶振为例)

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;系统主频64 MHZ,采用高速外部晶振&#xff0c;通过定时器3 每秒中断控制 PB9 引脚输出高低电平&#xff0c;从…

【服务器】服务器推荐

一、引言 在数字世界的浪潮中&#xff0c;服务器作为数据存储和处理的基石&#xff0c;其重要性不言而喻。而在这个繁星点点的市场中&#xff0c;雨云以其独特的优势和超高的性价比&#xff0c;逐渐成为众多企业和个人的首选。今天&#xff0c;就让我带你走进雨云的世界&#…

DC与DCT DCG的区别

先进工艺不再wire load model进行静态时序分析&#xff0c;否则综合结果与后端物理电路差距很大&#xff0c;因此DC综合工具也进行了多次迭代&#xff0c;DC工具有两种模式&#xff0c;包括wire load mode和Topographical Mode&#xff0c;也就是对应的DC Expert和DC Ultra。 …

ios抓包Tunnel to......443

fiddler官网下载“CertMaker for iOS and Android”插件&#xff0c;官网插件&#xff1a;https://www.telerik.com/fiddler/add-ons 双击运行插件后&#xff0c;重启fiddler&#xff0c;ios重新安装证书即可