Day22 LeedCode:235.二叉搜索树的最近公共祖先 701.二叉搜索树的插入操作 450.删除二叉搜索树的结点

news2024/12/23 19:54:56

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

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。

思路:上一篇文章有普通二叉树求最近公共祖先的讲解,本题也同样适用这个方法,但是我们可以利用二叉搜索树的特点,进一步优化代码,在二叉搜索树中公共祖先的val值一定介于两目标结点的val值之间(包括等于其中的一个值) .从上往下遍历这颗二叉搜索树,第一个遇到的val值介于pq的val值之间的结点一定是他们的公共结点.为什么?从该结点往左遍历,那么以后遇到的结点一定不是q的祖先结点,往右遍历,以后遇到的结点一定不是p的祖先结点.

递归三部曲:

1.确定返回值和参数的类型

返回目标结点,传入要遍历的树,和需要寻找的结点

TreeNode  traversal(TreeNode cur, TreeNode p, TreeNode q)

2. 确定结束条件

if (cur == NULL) return cur;

3.确定单层递归逻辑

根据二叉搜索树的特点,搜索二叉树,从上往下搜索到的第一个结点的val介于(包括等于其中的一个值)

 if(cur.val>p.val&&cur.val>q.val){
            return travel(cur.left,p,q);
        }

 if(cur.val<p.val&&cur.val<q.val){
            return travel(cur.right,p,q);
        }

return cur;

代码参考:

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

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

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

示例 1:

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]

思路:只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。

递归三部曲:

1.确定返回值和参数类型

返回一颗插入 结点后的树,传送需要插入的树,和需要插入的数

2.确定结束条件

遇到空结点就插入

3.确定单层逻辑

与当前结点的val值比较后决定插入在哪颗子树中

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

代码参考:

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

 


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

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

示例 1:

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]

思路:二叉搜索树的删除比添加难,需要改变树的结构.

将删除的结点的情况分为以下五种:

1.没找到删除的节点,遍历到空节点直接返回

找到删除的节点

2.左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点

3.删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点

4.删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点

5.左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

递归三部曲:

1.确定返回值和参数的类型:

返回一颗被修改的树,传入要修改的树和要删除的结点

2.确定结束条件:

删除结点的五种情况

3.单层递归逻辑

根据当前结点的val值决定在哪颗子树中删除

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
    if(root==null) return null;
    if(root.val==key&&root.left==null) return root.right;
    if(root.val==key&&root.right==null) return root.left;
    if(root.val==key&&root.left!=null&&root.right!=null){
        TreeNode cur=root.right;
//找到右子树的最左结点
        while(cur.left!=null){
            cur=cur.left;
        } 
//最左结点的左子树改为root的左子树
        cur.left=root.left;
        root.left=null;
        return root.right;//返回删除结点后的新树
    }
    if(root.val!=key){
        if(root.val>key){ root.left=deleteNode(root.left,key);}
        else{
root.right=deleteNode(root.right,key);
        }
        
    }
    return root;
    }
}

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

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

相关文章

基于Arduino IDE 野火ESP8266模块 一键配网 的开发

一、配网介绍 ESP8266 一键配网&#xff08;也称为 SmartConfig 或 FastConfig&#xff09;是一种允许用户通过智能手机上的应用程序快速配置 ESP8266 Wi-Fi 模块的方法&#xff0c;而无需手动输入 SSID 和密码。为了实现这一功能&#xff0c;则需要一个支持 SmartConfig 的智能…

[flask]执行上下文的四个全局变量

flask上下文全局变量&#xff0c;程序上下文、请求上下文、上下文钩子 -- - 夏晓旭 - 博客园 (cnblogs.com) 执行上下文 执行上下文&#xff1a;即语境&#xff0c;语意&#xff0c;在程序中可以理解为在代码执行到某一行时&#xff0c;根据之前代码所做的操作以及下文即将要…

校园app开发流程-uniapp开发-支持APP小程序H5-源码交付-跑腿-二手市场-交友论坛等功能,学校自由选择!

随着科技的不断发展&#xff0c;智慧校园系统和跑腿外卖小程序已经成为当今社会的热门话题。作为未来的重要趋势之一&#xff0c;科技在教育领域中的应用越来越广泛。本文将探讨智慧校园系统和跑腿外卖小程序的开发过程&#xff0c;并阐述如何利用科技“育”见未来 一、智慧校…

基于云计算的前端资源管理系统的设计与实现

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 随着互联网的快速发展&#xff0c;前端资源管理成为了一个重要的课题。本文旨在设计并实…

elementui日期时间选择框自定义组件

1.需求场景 业务中需要&#xff0c;日期选择框方便客户对日期的选择&#xff08;比如近5天&#xff0c;本周&#xff0c;本月&#xff0c;本年等等&#xff09;&#xff0c;并按小时展示。 2.组件代码MyDateTimeChange.vue <template><el-date-pickerv-model"…

【ESP32S3 Sense接入语音识别+MiniMax模型对话】

1. 前言 围绕ESP32S3 Sense接入语音识别MiniMax模型对话展开&#xff0c;首先串口输入“1”字符&#xff0c;随后麦克风采集2s声音数据&#xff0c;对接百度在线语音识别&#xff0c;将返回文本结果丢入MiniMax模型&#xff0c;进而返回第二次结果文本&#xff0c;实现语言对话…

Linux 系统 docker搭建LNMP环境

1、安装nginx docker pull nginx (默认安装的是最新版本) 2、运行nginx docker run --name nginx -p 80:80 -d nginx:latest 备注&#xff1a;--name nginx 表示容器名为 nginx -d 表示后台运行 -p 80:80 表示把本地80端口绑定到Nginx服务端的 80端口 nginx:lates…

【问题分析】InputDispatcher无焦点窗口ANR问题【Android 14】

1 问题描述 Monkey跑出的无焦点窗口的ANR问题。 特点&#xff1a; 1&#xff09;、上层WMS有焦点窗口&#xff0c;为Launcher。 2&#xff09;、native层InputDispacher无焦点窗口&#xff0c;上层为”recents_animation_input_consumer“请求了焦点&#xff0c;但是”rece…

国赛大纲解读

1. 第一部分,是针对5G基础知识的掌握,第二部分是人工智能基本算法的掌握,就是人工智能的应用,用5G+人工智能(AI算法)进行网络优化的问题,要有网络优化的基础知识,比如说:某个区域的覆盖问题,覆盖特别差,但有数据,覆盖电频,srp值这些数据给你,根据数据来判断是…

OCP NVME SSD规范解读-15.DSSD set feature功能要求-1

4.15.2 DSSD Set Feature Requirements章节重点描述了针对数据中心NVMe SSD&#xff08;DSSD&#xff09;特有的设置特性要求。在NVMe SSD规范中&#xff0c;通过Set Feature命令可以对SSD进行各种高级功能的设置和配置&#xff0c;DSSD特有的Set Feature命令集中了一些特定于D…

【Linux进阶之路】理解UDP,成为TCP。

前言 学了TCP 和UDP之后&#xff0c;感觉UDP就像是初入职场的年轻人&#xff0c;两耳不闻 “窗外事”&#xff0c;只管尽力地把自己的事情做好&#xff0c;但收获的却是不可靠&#xff0c;而TCP更像是涉世极深的"职场老油条"&#xff0c;给人的感觉就是 “城府极深&a…

被迫走上前端之路第四课之vue的表单双向绑定

在进行表单处理时&#xff0c;我们希望JavaScript中与表单绑定的变量能随着我们表单的输入或选择而动态的发生改变&#xff0c;或者说二者同步。这个时候就需要实现表单的双向绑定 使用v-on和v-bind实现 这里定义了一个输入框&#xff0c;v-bind实现了text的值到输入框的值的绑…

QT中的服务器与客户端

一、前言 本文主要讲讲QT中服务器与客户端的使用方法&#xff0c;QT已经封装好了&#xff0c;调用相应类直接访问即可。本文以QT中的QT中的TCP为例子&#xff0c;讲下使用方法以及线程中使用。 二、正文 2.1 Sever的使用方法 2.1.1 思路 QT中Sever使用的时候大致步骤为&…

Python抓取抖音直播间数据:技术探索与实践

目录 一、引言 二、技术准备 三、分析抖音直播间网页结构 四、编写爬虫代码 五、处理反爬虫机制 六、数据清洗与存储 七、总结 一、引言 随着互联网的快速发展&#xff0c;直播行业已成为当下的热门领域。抖音作为其中的佼佼者&#xff0c;吸引了大量的用户和主播。对于…

集合系列(十五) -CopyOnWriteArrayList详解

一、摘要 在介绍 CopyOnWriteArrayList 之前&#xff0c;我们一起先来看看如下方法执行结果&#xff0c;代码内容如下&#xff1a; public static void main(String[] args) {List<String> list new ArrayList<String>();list.add("1");list.add(&quo…

Flutter 常用插件Plugin整理并附带实例

最近有点空闲时间&#xff0c;正好写一篇文章&#xff0c;整理一下我们在Flutter开发中常用的插件Plugin使用并附带上实例。 在日常开发中&#xff0c;整个demo目前应该满足大家所有的开发需求&#xff0c;例如&#xff1a;http请求、列表刷新及加载、列表分组、轮播图、视频播…

如何使用Python结合Pillow、matplotlib和OpenCV实现图片读取

使用Pillow库 matplotlib是一个绘图库&#xff0c;经常用于数据可视化&#xff0c;但它也可以用来展示图片。 from PIL import Image# 读取图片 image Image.open(.jpg)# 展示图片 image.show()使用OpenCV库 OpenCV是一个强大的计算机视觉和机器学习库。它不仅提供了大量的图像…

记录关于智能家居的路程的一个bug___Segmentation fault(段错误)

前言 其实发生段错误的情况有很多&#xff1a; 其实在项目的开发中最有可能的错误就是①和②&#xff0c;考虑到本项目数组用的比较少&#xff0c;所以主要是考虑错误①指针的误用。 有时候错误就是那么离谱&#xff0c;声音也算是一种设备&#xff1f;&#xff1f;&#xff…

Vue使用el-statistic和el-card显示大屏中的统计数据

​ 一、页面内容&#xff1a; <el-row :gutter"20"><el-col :span"6"><el-card class"box-card"><div><el-statisticgroup-separator",":precision"2":value"value2":title"tit…

机器人寻路算法双向A*(Bidirectional A*)算法的实现C++、Python、Matlab语言

机器人寻路算法双向A*&#xff08;Bidirectional A*&#xff09;算法的实现C、Python、Matlab语言 最近好久没更新&#xff0c;在搞华为的软件挑战赛&#xff08;软挑&#xff09;&#xff0c;好卷只能说。去年还能混进32强&#xff0c;今年就比较迷糊了&#xff0c;这东西对我…