【代码随想录】刷题Day22

news2024/12/28 20:21:35

1.二叉搜索树的公共祖先

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

不同于普通二叉树,二叉搜索树得益于其顺序结构,其公共祖先的查找也有迹可循。自顶向下递归遍历,只要一个节点的val夹在p和q之间,那么该节点就是最近公共祖先。

1.首先公共祖先是必然的,因为val夹在q和p之间;

2.”最近“ 这个结论如何得到,我们假设它(cur1)不是最近的公共祖先,那么一定有另一个公共祖先(cur2),但是此时是冲突的,因为cur1不等于cur2,但是cur1在q和p之间,cur2也在p和q之间,cur1的子节点是cur2,cur1的左右某一分支一定包括了q和p,而不会在两边,所以矛盾

3.如果cur递归到空,返回空

4.那么如果递归下去,cur的值大于p和q的,那么我们要遍历cur左边,如果左边递归接住了节点,那么我们返回左边接住的节点

5.cur的值小于p和q的,那么我们要遍历cur右边,如果右边递归接住了节点,那么我们返回右边接住的节点

6.如果不是左右递归,说明此时q和p的父节点就是公共祖先,我们直接返回cur即可

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==nullptr)
            return nullptr;
        if(root->val>p->val&&root->val>q->val)
        {
            TreeNode* left = lowestCommonAncestor(root->left,p,q);
            if(left!=nullptr)
                return left;
        }
        else if(root->val<p->val&&root->val<q->val)
        {
            TreeNode* right = lowestCommonAncestor(root->right,p,q);
            if(right!=nullptr)
                return right;
        }
        return root;
    }
};

2.二叉搜索树的节点插入

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

非递归写法

1.如果root本身是空,root更新即可

2.此外,无非就是根据大小走左右,直到cur为空,不过在遍历时也要有prev前驱节点,保证最后cur到空,prev能与新节点连接

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        TreeNode* cur = root;
        TreeNode* prev = nullptr;
        if(root==nullptr)
        {
            root=new TreeNode(val);
            return root;
        }  
        while(cur)
        {
            if(cur->val>val)
            {
                prev=cur;
                cur=cur->left;
            }
            else
            {
                prev=cur;
                cur=cur->right;
            }
        }
        cur=new TreeNode(val);
        if(prev->val>cur->val)
            prev->left=cur;
        else
            prev->right=cur;
        return root;
    }
};

递归法

1.如果走到nullptr,说明此时需要建立节点

2.如果根节点的数值大,走左边,此时需要root->left接住最后也要构造的节点

3.如果根节点的数值小,走右边,也要root->right接住

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root==nullptr)
            return new TreeNode(val);
        if(root->val>val)
            root->left=insertIntoBST(root->left,val);
        else if(root->val<val)
            root->right=insertIntoBST(root->right,val);
        return root;
    }
};

3.二叉搜索树的节点删除

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

首先删除工作一定涉及到前驱节点,所以我们找节点还得顺便将其前驱节点找到。

那在我看来其实就三种情况的删除工作:cur为删除节点,prev为前驱节点

情况一:右节点为空

 有两中大情况:

root是删除的节点,那么我们更新root为cur的left;

root不是删除的节点:此时我们需要更新prev,注意prev的左节点还是右节点是cur,再连接:如果prev的left是cur,那么是prev的left与cur的right连接;如果prev的right是cur,那么是prev的right与cur的right连接

情况二:左节点为空

与上面的情况基本一致:

root是删除的节点,那么我们更新root为cur的right;

root不是删除的节点:此时我们需要更新prev,注意prev的左节点还是右节点是cur,再连接:如果prev的left是cur,那么是prev的left与cur的left连接;如果prev的right是cur,那么是prev的right与cur的left连接

情况三:左右都有

此时cur要么找左节点的最大值,要么找右节点的最小值交换,再删除cur值

左节点的最大值:左边树的最右节点

右节点的最小值:右边树的最左节点

那我这里写的是和右节点的最小值交换

这两个的操作基本一致:

1.我们先找到最左节点tmp,当然还需要这个的前驱ptmp

2.随后交换 cur和tmp的值

3.ptmp和tmp的位置判断,将ptmp和tmp的后续连接起来

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        TreeNode* cur = root;
        TreeNode* prev = nullptr;
        while(cur)
        {
            if(cur->val>key)
            {
                prev=cur;
                cur=cur->left;
            }
            else if(cur->val<key)
            {
                prev=cur;
                cur=cur->right;
            }
            else
            {
                if(cur->right==nullptr)
                {
                    if(cur==root)
                        root=cur->left;
                    else
                        if(prev->left==cur)
                            prev->left=cur->left;
                        else
                            prev->right=cur->left;
                    delete cur;
                }
                else if(cur->left==nullptr)
                {
                    if(cur==root)
                        root=cur->right;
                    else
                        if(prev->left==cur)
                            prev->left=cur->right;
                        else
                            prev->right=cur->right;
                    delete cur;
                }
                else
                {
                    TreeNode* ptmp = cur;
                    TreeNode* tmp = cur->right;
                    while(tmp->left)
                    {
                        ptmp=tmp;
                        tmp=tmp->left;
                    }
                    cur->val=tmp->val;
                    if(ptmp->right==tmp){
                        ptmp->right=tmp->right;
                    }
                    else
                        ptmp->left=tmp->right;
                    delete tmp;
                }
                break;
            }
        }
        return root;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML 中的常用标签用法

目录 1.基本结构 2.注释标签 3.标题标签 4.换行标签 5.格式化标签 6.图片标签 7.超链接标签 8.表格标签 合并单元格 9.列表标签 10.表单标签 form标签 input标签 补充 无语义标签 总 HTML是一种超文本标记语言,在网站上看到的信息都是它实现的.(是由标签所构…

RK3588平台开发系列讲解(内存篇)Linux 伙伴系统数据结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 页二、区三、内存节点沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 系统中,用来管理物理内存页面的伙伴系统,以及负责分配比页更小的内存对象的 SLAB 分配器了。 本篇将介绍伙伴系统相关数据结…

M304A_S905L3-B_5621无线蓝牙_当贝纯净桌面-线刷固件包

M304A_S905L3-B_5621无线蓝牙_当贝纯净桌面-线刷固件包 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0c;运…

springboot第19集:权限

article 文章表sys_permission 后台权限表sys_role 后台角色表sys_role_permission 角色-权限关联表sys_user 用户表sys_user_role 用户-角色关联表 image.png image.png sys_user_role id user_id(用户id) role_id(角色id) sys_role id role_name(角色名) create_time(创建时间…

决策树生成剪枝算法原理

决策树生成算法 首先明确信息熵 信息增益的概念 信息增益表示得知特征X信息是的类Y的信息不确定性减少的程度 H(D) 经验熵表示对数据D进行分类的不确定性 H(D|A)经验条件熵表示对特征A给定条件下对数据集D进行分类的不确定性&#xff08;显然这个值越小越好 那么g(D,A)信息…

基于粒子群优化的中文文本分类

基本思路&#xff1a; 方法&#xff1a;使用优化算法&#xff08;如粒子群&#xff09;优化支持向量机SVM&#xff1b; 本文所使用的应用背景&#xff1a;中文文本分类&#xff08;同时可以应用到其他背景领域&#xff0c;如&#xff09; 应用背景&#xff08;元启发式算法优…

(学习日记)2023.5.9

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

QTableview常用几种代理总结

QTableview常用几种代理总结 [1] QTableview常用几种代理总结1、QCheckBox和QRadioButton的嵌入2、QHeadView中嵌入QCheckBox类3、QCombobox的嵌入4、 QCombox QCheckBox类5、SpinBox的嵌入类6、QProcess的嵌入类7、QProcess绘制版本的嵌入类8、QPushButton/QLabel/QImage的嵌…

鸿蒙Hi3861学习八-Huawei LiteOS-M(事件标记)

一、简介 事件是一种实现任务间通信的机制&#xff0c;可用于实现任务间的同步。但事件通信只能是事件类型的通信&#xff0c;无数据传输。一个任务可以等待多个事件的发生&#xff1a;可以是任意一个事件发生时唤醒任务进行事件处理&#xff1b;也可以是几个事件都发生后才唤醒…

mongodb副本集搭建

1.本次搭建使用三台centos7主机搭建集群&#xff0c;关闭防火墙和selinux服务 2.主机信息如下图所示 主机名称IPPortServiceA10.1.60.11427017mongodbB10.1.60.11527017mongodbC10.1.60.11827017mongodb 3.从官网下载mongodb安装包(我这里下载的是6.0.5版本的tgz包) Instal…

小家电LED显示驱动多功能语音芯片IC方案 WT2003H4 B002

随着时代的进步&#xff0c;智能家电的普及已经成为了一个趋势。而在智能家电中&#xff0c;LED显示屏也成为了不可或缺的一部分。因此&#xff0c;在小家电的设计中&#xff0c;LED显示驱动芯片的应用也越来越广泛。比如&#xff1a;电饭煲、电磁炉、数字时钟、咖啡机、电磁炉…

【Vue3】如何创建Vue3项目及组合式API

文章目录 前言 一、如何创建vue3项目&#xff1f; ①使用 vue-cli 创建 ②使用可视化ui创建 ③npm init vite-app ④npm init vuelatest 二、 API 风格 2.1 选项式 API (Options API) 2.2 组合式 API (Composition API) 总结 前言 例如&#xff1a;随着前端领域的不断发展&am…

【SSM框架】SpringMVC 中常见的注解和用法

SSM框架 SpringMVC 中常见的注解和用法基础注解介绍RequestMapping 注解介绍PostMapping 和 GetMapping 注解介绍 获取参数相关注解的介绍只通过 RequestMapping 来获取参数只传递一个参数传递对象参数传递多个参数(非对象) RequestParam 后端参数重命名required 必传参数的设置…

SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)

场景 SpringBoot搭建的项目需要对开放的接口进行防刷限制&#xff0c;不同接口指定多少秒内可以请求指定次数。 比如下方限制接口一秒内最多请求一次。 注&#xff1a; 博客&#xff1a;霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主 实现 1、实现思路 首…

flink学习37:DataStream/DataSet与Table的互相转换

DataStream/DataSet转换成视图 DataStream/DataSet转换成表 表转换成DataStream/DataSet 表转换为DataStream/DataSet时&#xff0c;需要指定字段数据类型&#xff0c;最方便的就是把数据类型定为row&#xff0c;即行数据。 两种模式&#xff1a; 把表转为dataStream 把表转为d…

100ASK-V853-PRO编译烧写

100ASK_V853-PRO 环境配置及编译烧写 0.前言 本章主要介绍关于100ASK_V853-PRO开发板的Tina SDK包的下载和编译打包生成镜像&#xff0c;并将镜像烧录到100ASK_V853-PRO开发板上。在进行100ASK_V853-PRO开发板的环境配置前需要获取配置虚拟机系统&#xff0c;可以参考&#x…

【C语言督学训练营 第十二天】三篇文章吃透数据结构中的线性表(三)----- 线性表考研真题

文章目录 前言题目描述题目分析代码实战 前言 本篇博客从头到尾都在解析一道2019年考研真题中的一道关于链表的大题&#xff0c;虽然题目没有竞赛算法题那么复杂&#xff0c;那么难想&#xff0c;但是我们依旧可以从中收获到好多知识&#xff0c;本题的突破点就是快慢指针与链…

AP5153 线性降压恒流驱动芯片 2.5A

AP5153 是一种 PWM 调光的、低压 差的 LED 线性降压恒流驱动器。 AP5153 仅需要外接一个电阻和一个 NMOS 管就可以构成一个完整的 LED 恒 流驱动电路&#xff0c; 调节该外接电阻就可以调节 输出电流&#xff0c;输出电流可调范围为 20mA 到 3.0A。 AP5153 还可以通过在 DIM…

echarts x轴与y轴 刻度 数据设置

xAxis: {nameTextStyle: {fontWeight: "bold",fontSize: "20",align: "left",},splitLine: {show: false,},axisLine: {show: true,symbol: ["none", "arrow"], //加箭头处symbolOffset: 0,lineStyle: {color: "rgb(12…

aardio的优缺点,强烈推荐大家试用一下,可以用它在windows下面写一些小工具

概述 官网 aardio是一种用于Windows平台的脚本编程语言&#xff0c;以及一个功能丰富的集成开发环境&#xff08;IDE&#xff09;。它结合了强大的原生Windows API访问能力和简单易学的语法。以下是aardio的一些优缺点。 优点&#xff1a; 简单易学&#xff1a;aardio的语法简…