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

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

给定一个二叉搜索树,可以利用它的性质(左子树上所有节点的值都小于根节点的值,右子树上所有节点的值都大于根节点的值)找到两个节点的最近公共祖先。因此,可以进行如下操作:

  • 如果节点p和节点q都在root的右边,则公共祖先必然在root的右子树中,所以我们将搜索范围缩小为root的右子树。
  • 如果节点p和节点q都在root的左边,同理,我们将搜索范围缩小为root的左子树。
  • 如果条件1和条件2都不满足,说明节点p和节点q分别在root的两侧,所以,root就是我们要找的最近公共祖先。
/*** 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) {while(true){if(root.val < p.val && root.val < q.val){// p, q 都在root的右子树中root = root.right;} else if(root.val > p.val && root.val > q.val){// p, q 都在root的左子树中root = root.left;} else {break;}}return root;}
}

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

左子树上所有节点的值都小于根节点的值,右子树上所有节点的值都大于根节点的值。我们将新的值与根节点的值进行比较,如果新值小于当前节点的值,我们就在左子树上进行这个操作;如果新值大于当前节点的值,我们就在右子树上进行这个操作。如果遇到当前节点为空,就在这个位置插入新的值。

/*** 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 insertIntoBST(TreeNode root, int val) {// 如果根节点为空 那么新值就会被插入到这个位置if(root == null){return new TreeNode(val);}// 如果新值大于当前节点的值 那么就在右子树上插入新值if(val > root.val){root.right = insertIntoBST(root.right,val);}// 如果新值小于当前节点的值 那么就在左子树插入新值else if(val < root.val){root.left = insertIntoBST(root.left,val);}return root;}
}

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

删除二叉搜索树中的一个节点有以下几个步骤:

  1. 如果节点为空(即,树为空),我们直接返回 null。
  2. 如果 key 大于当前节点的值,我们需要在右子树中删除;
  3. 如果 key 小于当前节点的值,我们需要在左子树中删除;
  4. 如果 key 等于当前节点的值,那么我们需要删除这个节点,有以下几种情况:
    • 节点是叶子节点(即没有子节点),我们可以直接删除节点,返回 null;
    • 节点只有一个非空子节点,我们可以直接让它的子节点替代自己;
    • 节点有两个子节点,那么我们需要找到左子树中的最大节点(或右子树中的最小节点)来替代自己,然后删除那个节点。

class Solution {public TreeNode deleteNode(TreeNode root, int key) {if (root == null) {return null;}if (key > root.val) { // 在右子树中删除root.right = deleteNode(root.right, key);} else if (key < root.val) {// 在左子树中删除root.left = deleteNode(root.left, key);} else {// 当前节点就是需要删除的节点if (root.left == null) {// 如果没有左子节点,让右子节点替代自己return root.right;} else if (root.right == null) {// 如果没有右子节点,让左子节点替代自己return root.left;} else {// 如果有两个子节点,找到左子树中的最大节点来替代自己TreeNode maxNode = findMax(root.left);root.val = maxNode.val;// 删除左子树中的最大节点root.left = deleteNode(root.left, maxNode.val);}}return root;}private TreeNode findMax(TreeNode node) {while (node.right != null) {node = node.right;}return node;}
}

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

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

相关文章

Jmeter(119)-函数threadNum妙用

今天的接口场景是&#xff1a;有N个用户需要每隔5秒去查询一次数据&#xff0c;也就是说N个用户会去循环执行同一个接口。一开始的时候将用户参数化时使用了counter&#xff0c; 要执行2个线程3次循环&#xff0c;发现每次循环时&#xff0c;接口中用户参数的数据就会不一样&am…

【AutoGluon_01】自动机器学习框架的安装与示例

文章目录 一、安装二、示例一 AutoGluon预测目标数据1、导入数据2、训练3、预测4、评估5、小结 三、示例二 AutoGluon多模态预测&#xff08;Multimodal Prediction&#xff09;1、导入数据2、训练3、预测4、评估 四、示例三 AutoGluon进行时间序列预测1、导入数据2、训练3、预…

漫谈大数据时代的个人信息安全(三)——“点赞之交”

大数据时代的个人信息安全系列三&#xff1a;“点赞之交” 1. 点赞之交2. 点赞诈骗3. 个人信息保护小贴士 互联网就像公路&#xff0c;用户使用它&#xff0c;就会留下脚印。 每个人都在无时不刻的产生数据&#xff0c;在消费数据的同时&#xff0c;也在被数据消费。 近日&am…

AJAX异步请求JSON数据格式

目录 前言 1.AJAX的实现方式 1.1原生的js实现方式 1.2JQuery实现方式 2.1语法 3.JSON数据和Java对象的相互转换 3.1将JSON转换为Java对象 3.2将Java对象转换为JSON 前言 AJAX&#xff1a;ASynchronous JavaScript And XML 异步的JavaScript 和 XML。 Ajax 是一种在…

git导出提交日志

%ai是2023-06-16 14:49:10 0800时间格式 Git - 查看提交历史Git 官方中文操作文档 Git - 查看提交历史 导出excel,csv格式 筛选作者的提交--author"ayuyuer" git log --prettyformat:"%h","%an","%ae","%ai","%s&qu…

微信小程序

页面跳转&#xff1a; navigator 显示跳转 跳转普通页面跳转 tab栏页面 open-type"switchTab"回退上一个 open-type"navigateBack" <navigator url"/pages/detail/detail?usernamecc&addresschengdu">detail</navigator>js跳…

Spring Boot 各种回滚骚操作实战(自动回滚、手动回滚、部分回滚)

概念 事务定义 事务&#xff0c;就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行&#xff0c;我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行&#xff0c;我们称该事务被提交。…

springboot sentinel 整合 规则详情和代码实现-分布式/微服务流量控制

文章目录 sentinel控制台安装目标版本说明sentinel 规则整合验证pom.xml配置注解拦截资源控制规则---内存模式测试controller客户端接入控制台 测试sentinel控制台接口调用 下一篇&#xff1a;配置持久化策略规则外传 sentinel控制台安装 下载地址&#xff1a;https://github.…

Go语言之并发编程练习,GO协程初识,互斥锁,管道:channel的读写操作,生产者消费者

GO协程初识 package mainimport ("fmt""sync""time" )func read() {defer wg.Done()fmt.Println("read start")time.Sleep(time.Second * 3)fmt.Println("read end") }func listenMusci() {defer wg.Done()fmt.Println(&qu…

vue 下拉框显示从后端请求的数据

下拉框<!-- 给产品添加推广人员弹出框 --><el-dialog :title"titlePerson" :visible.sync"openAddPerson" width"1000px" append-to-body><el-select v-model"this.bindingProductPerson.recommendId" filterable plac…

【C++】-list的具体使用

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

HTML学习 第一部分(前端学习)

参考学习网站: 网页简介 (w3schools.com) 我的学习思路是&#xff1a;网站实践视频。 视频很重要的&#xff0c;因为它会给你一种开阔思路的方式。你会想&#xff0c;噢&#xff01;原来还可以这样。这是书本或者网站教程 所不能教给你的。而且&#xff0c;对一些教程&#…

Ubuntu搭建docker+laradock

使用Ubuntu搭建dockerlaradock windows 下载Ubuntu工具二选一 链接&#xff1a;https://pan.baidu.com/s/154K6MKdFZxWqaTn2q-6MSQ 提取码&#xff1a;06lc https://www.jianshu.com/p/b7e11d0dbe8c借鉴地址&#xff1a;https://zhuanlan.zhihu.com/p/547169542 备注&#x…

没有人能真正精通C++

目录 1、C的“双峰”特性 2、没人能真正精通C 3、世界仍然需要C 任何说自己很懂C的人可能都是在夸大其词。 我想你可能已经注意到了&#xff0c;是的&#xff0c;今天的大多数程序员都在使用Python、Rust、Go或是其他新的编程语言。大部分人已经不再需要掌握C、C等古老的编…

微信加粉计数器后台开发

后台包括管理后台与代理后台两部分 管理后台 管理后台自带网络验证卡密系统,一个后台可以完成对Pc端的全部对接,可以自定义修改分组名称 分享等等代理后台 分享页 调用示例 <?php$request new HttpRequest(); $request->setUrl(http://xxxxxxx/api); $request->…

【JavaScript】npm、Yarn 和 pnpm 的区别

npm、Yarn 和 pnpm 都是用于管理和构建 JavaScript 项目的包管理工具&#xff0c;以下是它们之间的一些区别和特点。 npm&#xff08;Node Package Manager&#xff09;&#xff1a; npm 是 Node.js 官方提供的包管理工具&#xff0c;是 JavaScript 生态系统中使用最广泛的包管…

IP获取归属地区(免费)

IP获取归属地区 使用 http://whois.pconline.com.cn/ipJson.jsp 这个 URL 来获取 IP 地址的归属城市信息 import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Objects; import javax.servlet.http.HttpServl…

Spingboot 多模块引入第三方jar包

1. 在需要的模块中引入jar包 2. 在此模块中的pom.xml 中引用 3. 要想打包部署服务器&#xff0c;需要在启动模块中添加配置信息 ps&#xff1a;启动模块要引用此模块才能将此一起jar打包部署 <build><plugins><plugin><groupId>org.springframework.…

距离比较器

根据传进来的初始点和其他经过点的集合&#xff0c;计算出初始点经过那些途经点的最佳路径。返回的就是初始点然后是途经点排好序的结果。 package com.nbomb.route.util;import com.nbomb.route.domain.Village; import org.springframework.stereotype.Component;import jav…

基于阿里云微信小程序语音识别

页面效果 其中采用阿里云语音识别&#xff1a;阿里云一句话语音识别 语音识别页面 <template><view><view class"chat_list"><view v-for"v in chatList" :class"v.type right ? type_right : type_left"><chat …