代码随想录算法训练营第二十天(二叉树 七)
day19 周日放假 今天依旧是二叉树环节
力扣题部分:
235. 二叉搜索树的最近公共祖先
题目链接:. - 力扣(LeetCode)
题面:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
思路:
和day18的二叉树公共祖先不同的是,这一次我们可以利用二叉搜索树的特点遍历一个路径就够了,其他的倒没什么太大区别。
具体思路细节内容可以看day18的最后一题 236. 二叉树的最近公共祖先,这里就不重复了。
传送门(day18):代码随想录算法训练营第十八天(二叉树 六)-CSDN博客
代码实现:
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(p -> val > q -> val) swap(q, p);if(root -> val >= p -> val && root -> val <= q -> val) return root;if(root -> val < p -> val && root -> right) return lowestCommonAncestor(root -> right, p, q);if(root -> val > q -> val && root -> left) return lowestCommonAncestor(root -> left, p, q);return nullptr;}
};
701.二叉搜索树中的插入操作
题目链接:. - 力扣(LeetCode)
题面:
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
思路:
按照最简单的想法,一条路径走到底最后创造一个叶子节点挂树上就好了,可以不重构二叉树就不要重构二叉树了,不然就很麻烦(就像下一道题)。
代码实现:
class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(!root){TreeNode* newnode = new TreeNode(val);return newnode;}if(root -> val > val) root -> left = insertIntoBST(root -> left, val);if(root -> val < val) root -> right = insertIntoBST(root -> right, val);return root;}
}; 450.删除二叉搜索树中的节点
题目链接:. - 力扣(LeetCode)
题面:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
思路:
我们知道插入可以插入在叶子节点也可以不插入在叶子节点,而删除就没得选择,所有情况都要考虑,那就得按需要删除的结点情况分类讨论了:
1.没找到。
解决办法:遍历到空节点直接返回。
2.找到了,在叶子节点上。
解决办法:删除节点并返回空节点。
3.找到了,左边有子树右边没有。
解决办法:像链表一样,要删除的节点的父节点指向要删除节点的左节点,相当于绕过要删除的节点,然后记得删除释放空间。
4.找到了,右边右子树左边没有。
解决办法:和第三条类似,父节点指向删除节点的右节点。
5.找到了,左右两边都有子树。
解决办法:最难的部分。先讲操作:将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
我们知道二叉搜索树要保证中序遍历递增,删除节点的左子树全部比右子树小,该节点一删右节点像之前一样一补上去,整个左子树就悬空了,由于左子树都比右子树小,所以只能把悬空的左子树根节点放在右节点最小的节点左侧,这样就可以让中序遍历仍旧是递增的了。(如果还有点懵,可以尝试画个图自己手动删除节点理解一下)
代码实现:
class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if (root == nullptr) return root; // 第一种情况if (root->val == key) {// 第二种情况if (root->left == nullptr && root->right == nullptr) {delete root;return nullptr;}// 第三种情况else if (root->left == nullptr) {auto retNode = root->right;delete root;return retNode;}// 第四种情况else if (root->right == nullptr) {auto retNode = root->left;delete root;return retNode;}// 第五种情况else {TreeNode* cur = root->right; // 找右子树最左面的节点while(cur->left != nullptr) {cur = cur->left;}cur->left = root->left;TreeNode* tmp = root;root = root->right;delete tmp;return root;}}if (root->val > key) root->left = deleteNode(root->left, key);if (root->val < key) root->right = deleteNode(root->right, key);return root;}
}; 相关文章:
代码随想录算法训练营第二十天(二叉树 七)
day19 周日放假 今天依旧是二叉树环节 力扣题部分: 235. 二叉搜索树的最近公共祖先 题目链接:. - 力扣(LeetCode) 题面: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T …...
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
🌟 Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发 🔹 django 通用表单视图 Django 的通用表单视图提供了快速创建和处理表单的功能,使得表单处理变得简洁而高效。以下示例展示了如何使用通用表单视图创建一个…...
Cookie和Session是什么?它们的区别是什么?
【知识】深入理解COOKIE&SESSION的原理和区别-腾讯云开发者社区-腾讯云 (tencent.com) Cookie和Session的区别(面试必备)_cookie和session的作用和区别-CSDN博客 Cookie和Session是什么?它们的区别是什么?_cookie里面的字符…...
Python正则表达式提取车牌号
在Python中使用正则表达式(Regular Expressions)来提取车牌号是一个常见的任务,尤其是在处理车辆信息或进行图像识别后的文本处理时。中国的车牌号格式多种多样,但通常包含省份简称、英文字母和数字。以下是一个使用Python正则表达…...
视觉引导机械臂学习记录
首先是几个位置,拍照位、示教位、目标位置。 流程主要是 1.首先选取一个拍照位,相机扫描点云,通过点云质量进行选取。并且制作点云模板,进行配准,如果配准分数高则模板选取正确。 2.用相机拍灰度图像,并…...
插屏广告在游戏APP中广告变现的独特优势
插屏广告是目前全球移动应用变现的主要广告形式之一,其优势在于可以快速收回成本,又能适应于多数缺乏激励场景的应用。 插屏广告通常在app使用过程中的自然过渡点,比如暂停场景切换的时候弹出,以图片、动图、视频等为表现形式的半…...
Python数据分析:数据可视化(Matplotlib、Seaborn)
数据可视化是数据分析中不可或缺的一部分,通过将数据以图形的方式展示出来,可以更直观地理解数据的分布和趋势。在Python中,Matplotlib和Seaborn是两个非常流行和强大的数据可视化库。本文将详细介绍这两个库的使用方法,并附上一个…...
Java CompletableFuture:你真的了解它吗?
文章目录 1 什么是 CompletableFuture?2 如何正确使用 CompletableFuture 对象?3 如何结合回调函数处理异步任务结果?4 如何组合并处理多个 CompletableFuture? 1 什么是 CompletableFuture? CompletableFuture 是 Ja…...
5个免费在线 AI 绘画网站推荐,附100+提示词!
在数字化时代,艺术创作与人工智能的结合已带来前所未有的创新体验。AI 绘画技术,基于先进的人工智能算法,为艺术创作提供了全新的视角和工具。当前,多个免费在线AI绘画平台应运而生,为创作者们提供了丰富的灵感和创作机…...
C++基础语法:while的使用
前言 "打牢基础,万事不愁" .C的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结. 引入 while的使用是编写代码的基础内容.笔者的记忆力已不如以前,最近遇到了还花了不少功夫,可见是掌握地不够牢固.所以对while的思路和内容…...
鹏哥C语言自定义笔记重点(29-)
29.函数指针数组 30.void指针是不能直接解引用,也不能-整数。 void*是无具体类型的指针,可以接受任何类型的地址。 31.qsort:使用快速排序的思想实现一个排序函数(升序) 32. 33.地址的字节是4/8 34.char arr[]{a,b} sizeof(arr[0]1)答案是4࿰…...
代码随想录算法训练营第六十天 | dijkstra(堆优化版)、Bellman_ford 算法精讲
一、dijkstra(堆优化版) 题目连接:47. 参加科学大会(第六期模拟笔试) (kamacoder.com) 文章讲解:代码随想录 (programmercarl.com)——dijkstra(堆优化版) 二、Bellman_ford 算法精讲…...
boost::asio 库版本,C/C++代码编译兼容性
1、boost::asio::spawn 开启有栈(stackful)协同程序,版本改进及限制 > boost_1_80 版本应采用以下方式。 auto f [self, this](const boost::asio::yield_context& y) noexcept {bool success_ do_handshake(y);if (!success_) {clo…...
前端开发的项目导入方法与应用
前端项目启动问题归集: 由于前端的项目对于npm的版本有要求,需要将其升级到20,所以必要的时候通过nvm,或者直接下载最新的安装包进行npm覆盖安装。在项目目录中应用npm i安装node_modules,如果没有正常安装的话&#…...
C++:模拟实现string
前言: 为了更好的理解string底层的原理,我们将模拟实现string类中常用的函数接口。为了与std里的string进行区分,所以用命名空间来封装一个自己的strin类。 string.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1#include<iostream&…...
浅谈Kafka(一)
浅谈Kafka(一) 文章目录 浅谈Kafka(一)Kafa的设计是什么样的数据传输的事务定义消息队列的应用场景Kafka怎么样判断节点是否存活Kafka的消息是采用pull模式还是push模式Kafka在磁盘上的消息格式Kafka高效文件存储设计特点Kafka与传…...
Redis7基础篇(八)
redis集群 是什么 能干吗 集群算法-分片-槽位slot redis集群的槽位slot redis集群的分片 分片和槽位的优势 槽位映射的解决方案 上面的三个方案分别对应了小厂 中厂 大厂 哈希槽取余分区 缺点 一致性哈希算法分区 小总结 哈希槽分区 经典面试题 这里说的redis是ap而不是cp的 …...
Tauri简介
在Tauri应用中,Rust和前端(通常是基于Web技术如React、Vue或Angular)之间的交互是一个核心特性,它允许开发者利用Rust的强大功能和性能,同时保持前端开发的灵活性和丰富的生态系统。这种交互主要通过Tauri提供的API桥接…...
JavaWeb——MVC架构模式
一、概述: MVC(Model View Controller)是软件工程中的一种 软件架构模式 ,它把软件系统分为模型、视图和控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户…...
Excel求和方法之
一 SUM(),选择要相加的数,回车即可 二 上面的方法还不够快。用下面这个 就成功了 三 还有一种一样快的 选中之后,按下Alt键和键(即Alt)...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
