java算法第22天 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

news2025/4/18 0:31:46

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

在这里插入图片描述
思路: 之前做过普通二叉树求共工作祖先的问题,有两种情况,

  • 第一种是:如果一个节点的左孩子和右孩子分别包含p,q节点,那么这个节点是p和q的最近公共祖先。
  • 第二种是:当前节点是p或q,其孩子节点包含q或p,则返回当前节点。
    那么本题是二叉搜索树,可以根据val的大小选择继续递归的方向是向左还是向右。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null) return null;
        if(p.val<root.val && q.val<root.val) return lowestCommonAncestor(root.left,p,q);
        if(p.val>root.val && q.val>root.val) return lowestCommonAncestor(root.right,p,q);
        return root;
    }

}

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路: 可以不考虑题目中提示所说的改变树的结构的插入方式。一定存在一个叶子节点,使val值作为它的左或右孩子是合理的。
可以不考虑题目中提示所说的改变树的结构的插入方式。
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        return delete(root,key);
    }

    public TreeNode delete(TreeNode node,int key){
        if(node==null) return null;
        if(node.val==key){
            if(node.left==null && node.right==null) return null;
            else if(node.left!=null && node.right==null) return node.left;
            else if(node.left==null && node.right!=null) return node.right;
            else{
                TreeNode cur=node.right;
                while(cur.left!=null) cur=cur.left;
                cur.left=node.left;
                return node.right;
            }
        }
        if(key<node.val){
            node.left=delete(node.left,key);
        }
        else{
            node.right=delete(node.right,key);
        }
        return node;
    }
}

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路: 相对于上一题的插入操作,本题就有难度了,涉及到改树的结构 。
要充分考虑到五种情况:

没有找到删除的节点

  • 第一种情况:没找到删除的节点,遍历到空节点直接返回了

找到删除的节点

  • 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
  • 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
  • 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
  • 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
    第五种情况有点难以理解,看下面动画:
    在这里插入图片描述
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        return delete(root,key);
    }

    public TreeNode delete(TreeNode node,int key){
        if(node==null) return null;
        if(node.val==key){
            if(node.left==null && node.right==null) return null;
            else if(node.left!=null && node.right==null) return node.left;
            else if(node.left==null && node.right!=null) return node.right;
            else{
                TreeNode cur=node.right;
                while(cur.left!=null) cur=cur.left;
                cur.left=node.left;
                return node.right;
            }
        }
        if(key<node.val){
            node.left=delete(node.left,key);
        }
        else{
            node.right=delete(node.right,key);
        }
        return node;
    }
}

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

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

相关文章

C++17中引入STL算法执行策略

C算法是一组预定义函数&#xff0c;可以对容器(例如数组、向量和列表)执行各种操作。这些算法具有定义的执行策略(have a defined execution policy)&#xff0c;决定它们如何执行以及如何与底层硬件交互。STL算法执行策略首先在C17标准中引入。 C17标准引入了三种新的执…

07 数据结构之图

# Makefile CCgcc CFLAGS -g -Wall SRCStest.c graph.c link_queue.c OBJS$(SRCS:.c.o) #variable replace APPtestall:$(OBJS) #指定一个目标&#xff0c; 不然默认目标不会检查依赖文件的时间戳$(CC) $(SRCS) -o $(APP) .PH…

Docker安装Prometheus监控

环境初始化 关闭防火墙 setenforce 0 vim /etc/selinux/config ##################内部代码################### SELINUXdisabled #关闭防火墙 ############################################ 安装docker #卸载yum源之前的docker安装包 sudo yum remove docker docker-clie…

如果你准备进入安全行业,入门应该做的

教育阶段 网络安全是一门高级学科。网络安全人员通常来自三个领域&#xff1a;系统管理、网络、开发。 假设你没有任何这些方面的背景&#xff0c;并且你需要从零开始。如果你在学生阶段的年龄&#xff1f; 这时有三种方法可选&#xff1a;大学、职业学校、资质证书 建议读计…

意大利数据监管机构对Sora展开调查

意大利数据保护监管机构 Garante3月8日宣布&#xff0c;将对 OpenAI 新推出的视频人工智能模型 Sora 展开隐私调查。 监管机构虽然没有对 OpenAI 提出任何具体指控&#xff0c;但表示正在研究 Sora 对意大利&#xff08;包括欧盟&#xff09;个人数据使用可能产生的潜在影响&am…

OceanBase中binlog service 功能的试用

OBLogProxy简介 OBLogProxy即OceanBase的增量日志代理服务&#xff0c;它可与OceanBase建立连接并读取增量日志&#xff0c;从而为下游服务提供了变更数据捕获&#xff08;CDC&#xff09;的功能。 关于OBLogProxy的详尽介绍与具体的安装指引&#xff0c;您可以参考这篇官方OB…

【C++那些事儿】深入理解C++类与对象:从概念到实践(下)| 再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元

&#x1f4f7; 江池俊&#xff1a;个人主页 &#x1f525; 个人专栏&#xff1a;✅C那些事儿 ✅Linux技术宝典 &#x1f305; 此去关山万里&#xff0c;定不负云起之望 文章目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit 关键字 2. static成员2.1 概念…

unicloud delete 删除

delete 删除 unicloud 删除大概分为两种 一种是 通过指定文档ID删除 语法如下 collection.doc(_id).remove()还有一种是条件查找文档然后直接批量删除 语法如下 collection.where().remove()反正总归是先查找到指定数据,然后使用remove()函数删除 示例如下 collection.doc(…

软件应用实例,宠物医院处方笺模板实例,佳易王兽医电子处方开单管理系统软件操作教程

软件应用实例&#xff0c;宠物医院处方笺模板实例&#xff0c;佳易王兽医电子处方开单管理系统软件操作教程 一、前言 以下软件程序操作教程以佳易王兽医电子处方软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、兽医宠物店开电子处…

初识C++类和对象(1)

1.定义类 我们使用class进行表示类&#xff0c;class后面的是类名rect&#xff0c;在类里面我们可以定义成员变量&#xff0c;这个题目我们是要去求长方形的周长和面积&#xff0c;我们定义长方形的长&#xff0c;和长方形的宽度&#xff1b; 我们定义了2个函数计算长方形的周…

电视盒子什么品牌好?测评工作室揭晓电视盒子品牌排行榜

电视盒子是日常生活中最常见的&#xff0c;它有着不可取代的重要地位。每年我们会进行电视盒子的深度测评&#xff0c;最近我们的测评主题是电视盒子什么品牌好&#xff0c;购入了十几个电视盒子品牌旗下的产品&#xff0c;通过对比后总结了电视盒子品牌排行榜&#xff0c;想买…

金融需要多样性,量化需要C++!通过本文,你可以知道:1、为什么是C++

通过本文&#xff0c;你可以知道&#xff1a; 1、为什么是C 2、Python的用武之地 3、量化C岗位薪酬水平 C VS Python 量化交易系统开发语言主要用C&#xff0c;也有人用Python。 但是从经验看&#xff0c;用C开发的量化交易系统能够让在系统中程序运行的速度更快。 量化交易…

详细理解Transformer

上一篇文章中&#xff0c;我们解读了Transformer中的Self-Attention的实现细节&#xff0c;这篇文章中&#xff0c;就Transformer的整体做一个算法解读。 首先&#xff0c;我们还是把Transformer的架构图贴出来&#xff0c;作为本篇内容的抓手。 从图中我们可以看到&#xff0…

迷茫了!去大厂还是创业?

大家好&#xff0c;我是麦叔&#xff0c;最近我创建了一个 学习圈子 有球友在 星球 里提问。 大厂的layout岗位和小厂的硬件工程师岗位&#xff0c;该如何选择&#xff1f; 这个问题我曾经也纠结过&#xff0c;不过现在的我&#xff0c;I am awake&#xff01; 肯定是有大点大。…

2023 年安徽省职业院校技能大赛(高职组)

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&#…

2024长三角快递物流供应链与技术装备展览会(杭州站)

2024.7.8-10 杭州国际博览中心 科技创新&#xff0c;数字赋能 同期举办&#xff1a;数字物流技术展 新能源商用车及物流车展 电商物流包装展 冷链物流展 指导单位 国家邮政局发展研究中心浙江省邮政管理局中国快递协会 承办单位 上海信世展览服务有限公司 主办单位 浙江…

使用 pg_profile 在 Postgres 中生成性能分析报告

前言&#xff1a; postgres数据库中拥有大量的辅助插件用于帮助DBA更好的分析数据库性能或整个集群&#xff0c;包括索引、I/O、CPU和内存等&#xff0c;pg_profile是基于PostgreSQL标准统计信息视图的诊断工具&#xff0c;它类似于Oracle AWR架构&#xff0c;和Oracle一样&am…

MFC 添加MFC类方法

1、打开工程目录的"类视图" 2、工程名右键添加"MFC类" 3、填写"类名"并选择“基类”CDialog&#xff0c;对话框ID填写添加好的对话框ID

2024(1),Android高分面试指南

以前&#xff0c;见到过挺多这样的新闻&#xff0c;某些学霸&#xff0c;成绩稍微有点下滑之类的&#xff0c;就受不了&#xff0c;做出一些过激的行为。如自杀等。这是非常懦弱的表现。究其背后&#xff0c;这是因为他们把自己蹦的太紧了。就像气球&#xff0c;你憋着一直吹气…

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论二】

前言&#xff1a; 本篇主要参考《Wasserstein GAN and the Kantorovich-Rubinstein Duality》 重点介绍一下 WGAN 的损失函数 是如何通过 Wasserstein Distance 变换过来的。 分为5步&#xff1a; 我们首先建立Wasserstein Distance 极小值形式&#xff0c; 经过对…