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

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) {//遇到节点为空,就返回一个val值的节点,相当于将该节点接到子节点的左子树或者右子树上if(root == null) return new TreeNode(val);//如果val小于root.val,说明应该往左边插入if(val < root.val) root.left = insertIntoBST(root.left,val);//如果val大于root.val,说明应该往右边插入else root.right = insertIntoBST(root.right,val);//返回完成操作之后的root即可return root;}
}

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

这道题就复杂得多,删除节点所涉及的情况有五种,因为遇到要删除的节点需要立马删除,所以将删除的操作体现在终止条件里,并返回删除之后的root节点。
删除的节点的五种可能性:
1.整个二叉数都没有key节点
2.key节点在叶子节点上
3.key节点的右节点不为空,左节点为空,返回root.left
4.key节点的左节点为空,右节点不为空,返回root.right
5.key节点的左右节点都为不为空,这种情况是最复杂的,需要先将key节点左子树接到右子树最小值的左边
如下图所示,我们要删除的key为11,那么再删除之前,要将左子树处理一下。
在这里插入图片描述
将左子树拼接到右子树上那个比自己根节点大一点点的那个节点的左边,然后删除val=11的节点
在这里插入图片描述
最后得到了这个处理之后的二叉树
在这里插入图片描述
代码如下:

/*** 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) {//终止条件较为复杂,有五种不同的情况。并且key节点发现即要删除,因此删除的操作也包含在终止条件中//情况一:没有找到key,返回nullif(root == null) return null;//后四种情况属于找到key节点的这一前提下的子情况if(root.val == key){//情况二:找到的key为叶子结点,直接删除即可//因为后面会用父节点的左子树去承接,因此返回null相当于删除if(root.left == null && root.right == null) return null;//情况三:左空右不为空else if(root.left == null && root.right != null) return root.right;//情况四:右空左不为空else if(root.left != null && root.right == null) return root.left;//情况五:左右均不为空//需要先将左子树移到右子树中最小的节点的左子树上,以保证删除后符合平衡TreeNode cur = root.right;while(cur.left != null) cur = cur.left;cur.left = root.left;//将当前节点删除return root.right;}//需要判断向哪一边去寻找要删除的key节点if(key > root.val) root.right = deleteNode(root.right,key);if(key < root.val) root.left = deleteNode(root.left,key);return root;}
}

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

236. 二叉树的最近公共祖先

这两个题目可以用一套相同的解法,代码如下:

/*** 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) {return returnNode(root,p,q);}public TreeNode returnNode(TreeNode root, TreeNode p, TreeNode q){//终止条件,遇到空或者q或者q就可以返回了if(root == null) return null;//遇到空即返回if(root.val == p.val || root.val == q.val) return root;//如果遇到p或者q,就返回root//左TreeNode leftNode = returnNode(root.left,p,q);//右TreeNode rightNode = returnNode(root.right,p,q);//中if(leftNode != null && rightNode != null) return root;else if(leftNode == null && rightNode != null) return rightNode;else if(leftNode != null && rightNode == null) return leftNode;else return null;}
}

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

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

相关文章

A45 STM32_HAL库函数 之 SMARTCARD通用驱动 -- A -- 所有函数的介绍及使用

A45 STM32_HAL库函数 之 SMARTCARD通用驱动 -- A -- 所有函数的介绍及使用 1 该驱动函数预览1.1 HAL_SMARTCARD_Init1.2 HAL_SMARTCARD_DeInit1.3 HAL_SMARTCARD_MspInit1.4 HAL_SMARTCARD_MspDeInit1.5 HAL_SMARTCARD_ReInit1.6 HAL_SMARTCARD_Transmit1.7 HAL_SMARTCARD_Rece…

mysql 8 创建用户,并对用户授权

创建用户&#xff1a; 对MySQL创建新用户。命令如下&#xff1a; create user devuser% identified by 123456; 授予权限 grant all privileges on joolun_ry.* to devuser% with grant option; 参数说明&#xff1a; joolun_ry&#xff1a;表明对那个库进行授权&#xf…

BFD(简单配置实验)

实验拓扑 配置接口IP地址 正常互通 配置静态BFD 查看状态&#xff1a;为UP 与静态路由联动 查看静态路由状态为active 将交换机的接口down掉 BFD的状态为down 再次查看静态路由的状态为Inactive

Qt事件的详细介绍和原理

介绍 事件类型&#xff1a; 1、窗口系统事件spontaneous。 2、异步事件PostEvent。 3、同步事件SendEvent 窗体系统事件spontaneous 代表事件有&#xff1a;各类外设事件&#xff0c;如鼠标单双击、滚轮、移动&#xff0c;键盘按键等事件。 使用场景&#xff1a;该类事件都是…

RawChat:优化AI对话体验,全面兼容GPT功能平台

文章目录 一、Rawchat简介1.1 RawChat的主要特性1.2 RawChat的技术原理简述 二、使用教程三、案例应用3.1 图片内容分析3.2 生图演示3.3 文档解析3.4 探索更多 四、小结 一、Rawchat简介 RawChat平台的诞生&#xff0c;其核心理念是降低用户访问类似ChatGPT这类先进AI服务的门…

Git使用-gitlab上面的项目如何整到本地的idea中

场景 一般我们在开发项目或者接手某个项目时&#xff0c;基本都要接触Git&#xff0c;比如上传项目代码&#xff0c;下载同事给你的交接代码等等。 这是一个基本功&#xff0c;小小整理一下日常操作中的使用。 第一步&#xff1a;在 GitLab 上找到你要克隆的项目&#xff0c;复…

干部管理软件有哪些

随着信息技术的飞速发展&#xff0c;干部管理软件在各级党政机关、国企事业单位中扮演着越来越重要的角色。这些软件通过整合干部管理的各项业务流程&#xff0c;实现了干部信息的系统化、规范化和高效化管理。以下是几款主流的干部管理软件及其特点&#xff1a; 一、干部信息…

QT小技巧

QT小技巧 滑条的美化 美化前 代码如下 //滑条的美化ui->horizontalSlider->setStyleSheet("QSlider::groove:horizontal {""border:1px solid skyblue;""background-color:skyblue;""height:10px;""border-radius:5px…

NFS网络文件存储入门

一、NFS介绍 NFS全称Network Files System&#xff0c;中文叫网络文件系统&#xff0c;是1980年由SUN发展出来在UNIX&Linux系统间实现磁盘文件共享的一种方法。NFS是当前互联网系统架构中最常用的服务之一&#xff0c;特别是中小公司应用频率很高。大公司可能用MFS&#x…

Nextjs 集成富文本编辑器react-quill

目录 一、组件代码 二、参考文档 由于Next与react有些差别&#xff0c;直接调用组件会报无法找到文档的错误&#xff0c;于是我们只有考虑动态导入了解决问题。因为富文本编辑器一般作用与form页面对SEO意义不大&#xff0c;所以这里可以考虑暂时关闭SSR。 一、组件代码 /*…

【系统架构】REST风格

系列文章目录 第一章 系统架构的演进 第二章 REST风格架构 文章目录 系列文章目录前言一、进程间的通信普通管道&#xff08;Pipe&#xff09;或者具名管道&#xff08;Named Pipe&#xff09;信号&#xff08;Signal&#xff09;信号量&#xff08;Semaphore&#xff09;消息…

C++ 字符串处理5-手机号邮箱如何脱敏处理

1. 关键词2. strutil.h3. strutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 关键词&#xff1a; C 字符串处理 分割字符串 连接字符串 跨平台 应用场景&#xff1a; 有些重要信息需要保密&#xff0c;比如手机号、邮箱等&#xff0c;如何在不影响用户阅读的情况下…

Hadoop之HDFS分布式文件系统

HDFS简介 Hadoop Distributed File System (HDFS): HDFS 是 Hadoop 的分布式文件系统,它设计用于存储大量数据,并提供 高吞吐率的数据访问,通过将数据分块存储在多个节点上,实现数据的冗余存储和容错。 HDFS重要概念 HDFS 通过统一的命名空间目录树来定位文件; 另外,它…

zookeeper、kakfa添加用户加密

背景 zookeeper无权限访问到根目录 步骤 在kafka/config 目录中创建 vi config/zookeeper_jaas.conf在zookeeper_jaas.conf中添加 Server { org.apache.kafka.common.security.plain.PlainLoginModule required username"admin" password"12345" user_ad…

温泉镇旅游微信小程序的设计与实现(论文+源码)_kaic

摘要 旅游业随着经济的快速发展呈现出一派欣欣向荣的景象&#xff0c;尤其是近两年来&#xff0c;各个行业运用科技以及因特网来促进旅游迅速发展&#xff0c;逐渐都显示出了的问题&#xff0c;特别突出的是在线上推广&#xff0c;其缺点也是特别明显。尽管在新冠肺炎的冲击下&…

uni-app前端,社区团购系统搭建部署

目录 前言&#xff1a; 一、社区团购模式&#xff1a; 二、社区团购系统功能&#xff1a; 三、总结&#xff1a; 前言&#xff1a; 区团购系统是一种利用互联网技术和组织力量&#xff0c;通过线上线下结合的方式&#xff0c;为社区居民提供方便快捷的商品和服务采购平台。…

制作一个超小的docker镜像

在制作docker镜像我们都希望能够制作一个超小的镜像&#xff0c;那么该怎么做呢&#xff0c;网上有很多优化镜像大小的方法&#xff0c;今天就不在重复了&#xff0c;今天给大家分享一个从源头控制大小的方案。 Docker Scratch镜像是一个特殊的Docker镜像&#xff0c;它不基于任…

案例学习-存量更新规划实施探索(武汉)

案例学习-存量更新规划实施探索&#xff08;武汉&#xff09; 武汉市在早期旧城更新实践中发现零散化的更新往往导致资源配置分散、城市建设破碎化等弊病&#xff0c;特别是由于过于强调项目自身“经济平衡”&#xff0c;在实施过程中也逐步暴露出住宅占比过大、强度偏高、公服…

JS:获取鼠标点击位置

一、获取鼠标在目标元素中的点击位置 getClickPos.ts: export const getClickPos (e: MouseEvent) > {return {x: e.offsetX,y: e.offsetY,}; };二、获取鼠标在页面中的点击位置 getClickPos.ts: export const getPageClickPos (e: MouseEvent) > {return {x: e.pa…

算法day32

第一题 207. 课程表 步骤一&#xff1a; 通过下图的课程数组,首先画出DAG图&#xff08;有向无环图&#xff09; 步骤二&#xff1a; 其次我们按照DAG图&#xff0c;来构建该图的拓扑排序&#xff0c;等有效的点都按照规则排完序后&#xff0c;观察是否有剩下的点的入度不为0&…