代码随想录Day18 LeetCode235 二叉搜索树的公共祖先 T701二叉搜索树中的插入操作 T140 删除二叉搜索树中的公共节点

news2024/11/26 10:28:48

LeetCode T235 二叉搜索树的公共祖先

题目链接235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)

题目思路

此题不涉及遍历顺序.

关于二叉搜索树的定义,这里我就不过多赘述了,前面几篇都说清楚了,根节点比左子树元素都大,比右子树元素都小,这道题我们就可以知道,两个节点的最近公共祖先一定满足夹在两个节点的中间这个条件.

那么,夹在两个节点之间的一定是最近的公共祖先吗?

答案是肯定的,我们不妨这样想,如果我们的节点这个时候再向左遍历,我们就会丢失右子树包含的那个节点,左子树同理.思路理顺了我们就来书写代码吧.

递归三部曲

1.函数参数和返回值

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) 

2.终止条件

如果遇到空节点,直接返回空节点即可

         if(root == null)
        {
            return null;
        }

3.一次递归逻辑

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

其实我么也发现了,无论遇不遇到空节点都可以直接返回,那么我们的代码又可以进一步的简化.

题目代码

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

//上述代码的简化版
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
        if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
        return root;
    }
}



//迭代法
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while(true)
        {
            if(root.val>q.val && root.val>p.val)
            {
                root = root.left;
            }
            else if(root.val<q.val && root.val<p.val)
            {
                root = root.right;
            }
            else
            {
                break;
            }
        }
        return root;
        
    }
}

LeetCode T701 二叉搜索树中的插入操作

题目链接701. 二叉搜索树中的插入操作 - 力扣(LeetCode)

题目思路

这里我们看到这道题可以改变二叉搜索树的形状,可以返回任意有效的结果,我们就有点慌,其实这里我们所有节点的插入都可以在叶子节点完成,无论插入什么大小的节点我们都可以插入在叶子节点来解决问题.那么有了这个思路题目就变得简单了,我们只需要找到对应的叶子节点,创建一个新节点再连接即可.下面我们看看代码怎么写.

函数参数以及返回值

这里就用LeetCode本身提供的函数即可

2.终止条件

遇见空节点就说明我们找到了,直接创建新节点,向上返回即可

         if(root == null)
        {
            TreeNode node = new TreeNode(val);
            return node;
        }

3.单次递归

如果在左边插入,就用左子树来接收这个节点,反之用右子树来接收

        if(val<root.val)
        {
            root.left = insertIntoBST(root.left,val);
        }
        if(val>root.val)
        {
            root.right = insertIntoBST(root.right,val);
        }
        return root;

题目代码

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root == null)
        {
            TreeNode node = new TreeNode(val);
            return node;
        }
        if(val<root.val)
        {
            root.left = insertIntoBST(root.left,val);
        }
        if(val>root.val)
        {
            root.right = insertIntoBST(root.right,val);
        }
        return root;

    }
}

LeetCode T140 删除二叉搜索树的节点

题目链接450. 删除二叉搜索树中的节点 - 力扣(LeetCode)

题目思路

这里我们先考虑五种可能的情况

1.找不到这个key对应的节点

2.能找到

2.1这个节点是叶子结点

直接返回空即可

2.2这个节点的左孩子为空,右孩子不为空

返回右孩子

2.3这个节点的左孩子不为空,右孩子为空

返回左孩子

2.4这个节点左右孩子都不为空

这个的处理较为复杂,我们举个例子说明

假设我们要删除7节点,我们就得调整二叉树的结构

假设我们保留右子树(保留左子树也可以,方法一样)

我们找到右子树中的最小值(右子树中的左子树的最小值),将原左子树接在这个节点下面即可

递归逻辑

1.确定递归函数以及返回值

使用函数本身即可

2.确定终止条件

由于这次的终止条件是找到节点的过程,所以较为复杂

        if(root == null)
        {
            return null;
        }
        if(root.val == key)
        {
            if(root.left == null && root.right == null)
            {
                return  null;
            }
            else if(root.left != null && root.right == null)
            {
                return root.left;
            }
            else if(root.right != null && root.left == null)
            {
                return root.right;
            }
            else {
            TreeNode cur = root.right;
            while (cur.left != null) {
             cur = cur.left;
            }
            cur.left = root.left;
            root = root.right;
            return root;
      }

}

3.确定一次递归逻辑

        if(root.val<key)
        {
            root.right =  deleteNode(root.right,key);
        }
        if(key<root.val)
        {
            root.left =  deleteNode(root.left,key);
        }
        return root;

题目代码

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null)
        {
            return null;
        }
        if(root.val == key)
        {
            if(root.left == null && root.right == null)
            {
                return  null;
            }
            else if(root.left != null && root.right == null)
            {
                return root.left;
            }
            else if(root.right != null && root.left == null)
            {
                return root.right;
            }
            else {
            TreeNode cur = root.right;
            while (cur.left != null) {
             cur = cur.left;
            }
            cur.left = root.left;
            root = root.right;
            return root;
           }

        }
        if(root.val<key)
        {
            root.right =  deleteNode(root.right,key);
        }
        if(key<root.val)
        {
            root.left =  deleteNode(root.left,key);
        }
        return root;

    }
}

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

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

相关文章

计算机体系结构和操作系统

这篇文章的主要内容是冯诺依曼计算机体系结构和操作系统的理解。 目录 一.冯诺依曼计算机体系结构 二.操作系统的理解 一.冯诺依曼计算机体系结构 如图是冯诺依曼计算机体系结构&#xff0c;计算机本质就是对数据进行处理的机器&#xff0c;图中&#xff0c;数据从输入设备交给…

VMWare配置桥接

一、设置网络模式 二、编辑网卡配置 ip配置的子网掩码和默认网关保持和宿主机一致&#xff0c;ip局域网内不冲突。 # cd /etc/sysconfig/network-scriptslsvim ifcfg-ens160 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOnone DEFROUTEyes IPV4_FAILURE_FATALno IP…

【数据结构】双链表的相关操作(声明结构体成员、初始化、判空、增、删、查)

双链表 双链表的特点声明双链表的结构体成员双链表的初始化带头结点的双链表初始化不带头结点的双链表初始化调用双链表的初始化 双链表的判空带头结点的双链表判空不带头结点的双链表判空 双链表的插入&#xff08;按值插入&#xff09;头插法建立双链表带头结点的头插法每次调…

每日一题 1488. 避免洪水泛滥(中单,贪心,二分)

思路&#xff1a; 当某一天为晴天&#xff0c;可以选择抽水时&#xff0c;我们是不知道要抽哪一个的&#xff0c;最优解应该是抽接下来最近的要发洪水的湖泊&#xff0c;所以我们先把晴天的坐标保存下来&#xff0c;需要用的时候再拿出来需要注意的是&#xff0c;只有晴天发生…

【MATLAB源码-第46期】基于matlab的OFDM系统多径数目对比,有无CP(循环前缀)对比,有无信道均衡对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;正交频分复用&#xff09;是一种频域上的多载波调制技术&#xff0c;经常用于高速数据通信中。以下是关于多径数目、有无CP&#xff08;循环前缀&#xff09;以及有无信道均衡在OFDM系统中对误码率的影响&am…

Python对接海康威视机器视觉工业相机

一、下载MVS客户端 海康机器人-机器视觉-下载中心 二、解压并安装MVS客户端 三、找到MVS示例代码&#xff08;代码在MVS的安装位置&#xff09; 工业相机只允许单条连接&#xff0c;也就是说MVS如果连接了相机&#xff0c;python代码就无法获取数据&#xff0c;此时必须退出M…

计算机毕业设计 大学生选修选课系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

pinctrl子系统 - 架构和结构体关系(四)

一&#xff0c;pinctrl的引入 由于SoC系统越来越复杂、集成度越来越高&#xff0c;SoC中pin的数量也越来越多、功能也越来越复杂&#xff0c;这就对如何管理、使用这些pins提出了挑战。因此&#xff0c;用于管理这些pins的硬件模块&#xff08;pin controller&#xff09;就出…

MySQL读写分离之一主一从

原理 MySQL 的主从复制&#xff0c;是基于二进制日志&#xff08; binlog &#xff09;实现的。 准备 主机 角色 用户名 密码 192.168.2.3 master root newPwd520 192.168.2.4 slave root newPwd520 主从复制的搭建&#xff0c;可以参考 MYSQL的主从复制-CSDN博客 一主一从读…

【K8S】集群中部署nginx应用 运行手写yaml文件报错排查过程

文章目录 ❌报错信息&#x1f50e;排查过程✅问题解决 ❌报错信息 提取报错信息【 unknown field “spec.selector.replicas”】【 unknown field “spec.selector.template”】 [rootmaster ~]# kubectl apply -f nginx-deployment.yaml Error from server (BadRequest): erro…

CCF CSP认证 历年题目自练Day30

题目一 试题编号&#xff1a; 202203-1 试题名称&#xff1a; 未初始化警告 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 题目背景 一个未经初始化的变量&#xff0c;里面存储的值可能是任意的。因此直接使用未初始化的变量&#xff0c;比…

通过API接口进行商品价格监控,可以按照以下步骤进行操作

要实现通过API接口进行商品价格监控&#xff0c;可以按照以下步骤进行操作&#xff1a; 申请平台账号并选择API接口&#xff1a;根据需要的功能&#xff0c;选择相应的API接口&#xff0c;例如商品API接口、店铺API接口、订单API接口等&#xff0c;这一步骤通常需要我们在相应…

MyBatis(中)

1、动态sql&#xff1a; 1、if标签&#xff1a; mapper接口: //if 标签 多条件查询List<Car> selectByMultiConditional(Param("brand") String brand,Param("guidePrice") Double guidePrice,Param("carType") String carType); map…

ATF(TF-A)之UBSAN动态代码分析

安全之安全(security)博客目录导读 目录 一、UBSAN简介 二、TF-A中UBSAN配置选项 一、UBSAN简介 未定义行为消毒器(Undefined Behavior Sanitizer&#xff0c;UBSAN)是Linux内核的未定义行为动态检测器。 详细信息可参考&#xff1a;https://github.com/google/kernel-sanit…

3D 生成重建007-Fantasia3D和Magic3d两阶段玩转文生3D

3D生成重建3D 生成重建007-Fantasia3D和magic3d 文章目录 0 论文工作1 论文方法1.1 magic3d1.2 Fantasia3D 2 效果2.1 magic3d2.2 fantasia3d 0 论文工作 两篇论文都是两阶段法进行文生3d&#xff0c;其中fantasia3D主要对形状和外表进行解耦&#xff0c;然后先对geometry进行…

第五章 图

第五章 图 图的基本概念图的应用背景图的定义和术语 图的存储结构邻接矩阵邻接表 图的遍历连通图的深度优先搜索连通图的广度优先搜索 图的应用最小生成树拓扑排序 小试牛刀 图的基本概念 图结构中&#xff0c;任意两个结点之间都可能相关&#xff1b;而在树中&#xff0c;结点…

接口自动化测试,完整入门篇

1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…

Web安全基础:常见的Web安全威胁及防御方法 |青训营

Web安全基础&#xff1a;常见的Web安全威胁及防御方法 在现代Web开发中&#xff0c;安全性至关重要。Web应用面临各种潜在的威胁&#xff0c;包括跨站脚本&#xff08;XSS&#xff09;、跨站请求伪造&#xff08;CSRF&#xff09;等。了解这些威胁以及如何防御它们&#xff0c…

c语言练习87:合并两个有序数组

合并两个有序数组 合并两个有序数组https://leetcode.cn/problems/merge-sorted-array/ 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff…

Excel 自动提取某一列不重复值

IFERROR(INDEX($A$1:$A$14,MATCH(0,COUNTIF($C$1:C1,$A$1:$A$14),0)),"")注意&#xff1a;C1要空置&#xff0c;从C2输入公式 参考&#xff1a; https://blog.csdn.net/STR_Liang/article/details/105182654 https://zhuanlan.zhihu.com/p/55219017?utm_id0