算法训练营day22

一、二叉搜索树的最近公共祖先
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//得到p q的最大值,跟root比较//max < root 向左遍历 ,max > root 继续比较 min > root 向右遍历; min < root root就是最近公共节点if (root.val < p.val && root.val < q.val)return lowestCommonAncestor(root.right, p, q);if (root.val > p.val && root.val > q.val)return lowestCommonAncestor(root.left, p, q);return root;}
}
二、二叉搜索树的插入操作

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

大前提:该树节点值是不重复的

class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {
//如果root为空,即当前节点为空,说明这个位置可以插入新节点,于是创建一个值为val的新节点并返回。 或者(在递归当中) 如果 root 是空,则新建树节点作为根节点返回即可if (root == null) {return new TreeNode(val);  //终止条件}
//递归调用
//如果root不为空,需要根据当前节点的值与val的大小关系来确定插入的位置。如果root的值小于val,说明val应该插入到右子树中。相反,如果root的值大于或等于val,说明val应该插入到左子树中。if (root.val < val) { root.right = insertIntoBST(root.right, val);} else {root.left = insertIntoBST(root.left, val);}//返回结果return root;}
}

二叉搜索树的平均深度是 log⁡n,最坏情况是由于有序插入数据导致二叉搜索树退化成一条链表,此时深度是 n。因此上述两种解法的平均时间复杂度是 O(log⁡n),最坏时间复杂度是 O(n)。迭代写法的空间复杂度是 O(1),递归写法由于递归调用时会使用方法栈,而方法栈的深度就是二叉搜索树的深度,所以最坏空间复杂度是 O(n)。

所以说,二叉搜索树的深度是非常影响查找/插入性能的,所以说并不常用,广泛使用的是平衡搜索树。常见的平衡搜索树有 红黑树,B- 树,B+ 树(还有 ACM/OI 大佬们爱的 treap,splay,SBT)等。比如 Java 里的 TreeMap,TreeSet 和 HashMap 中链表的树化都是用红黑树实现的,又比如 InnoDB 的索引存储就是 B+ 树实现的。感兴趣的同学可以去学习下~学成归来之时,可以问候别人——能不能心里有点 B 树~

三、删除二叉搜索树中的节点

重点:当删除当前节点时,使用哪个节点来替代被删除节点? 使用左子树的最大节点 或 右子树的最小节点 来替代保持 二叉搜索树的性质

class Solution {public TreeNode deleteNode(TreeNode root, int key) {if (root == null) return null;if (root.val == key) {
//找到相等的值时判断左右子树是否为空,左子树为空返回右子树,右子树为空返回左子树,也适用于都为空的情况(return root.right;)if (root.left == null) return root.right;if (root.right == null) return root.left;
//如果都不为空,则遍历到左子树的最右端(最大值)TreeNode t = root.left;while (t.right != null) t = t.right;t.right = root.right;return root.left;//如果key不等于当前节点值 key > 向右递归,< 向左递归} else if (root.val < key) root.right = deleteNode(root.right, key);else root.left = deleteNode(root.left, key);//返回值return root;}
}

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

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

相关文章

AWS制作WordPress在国内外的利弊?

AWS作为全球领先的云计算服务供应商&#xff0c;为WordPress提供了强大且灵活的托管环境&#xff0c;使用AWS来搭建和运行WordPress无疑是个不错的选择。即便如此使用AWS制作还是会有些许利弊&#xff0c;九河云作为AWS的合作伙伴来为读者们仔细探讨AWS在WordPress的利弊。 利&…

学python的第十九天

网络通信和访问数据库 1.1 基本的网络知识 TCP/IP IP是低级的路由协议&#xff0c;它将数据拆分在许多小的数据包中&#xff0c;并通过网络将他们发送到某一特定地址&#xff0c;但无法保证所有包都抵达目的地&#xff0c;也不能保证包按顺序抵达 TCP&#xff08;传输控制协议…

深度学习系列65:数字人openHeygen详解

1. 主流程分析 从inference.py函数进入&#xff0c;主要流程包括&#xff1a; 1&#xff09; 使用cv2获取视频中所有帧的列表&#xff0c;如下&#xff1a; 2&#xff09;定义Croper。核心代码为69行&#xff1a;full_frames_RGB, crop, quad croper.crop(full_frames_RGB)。…

本地wsl的Ubuntu安装docker,不使用docker桌面版

第一步&#xff1a;安装docker引擎 建议大家去docker官网那边看 Install Docker Engine on Ubuntu | Docker Docs 第二步&#xff1a;使用以下命令 sudo update-alternatives --config iptables 选1就对了 第三步&#xff1a;启动docker service docker start

Android MVVM架构 + Retrofit完成网络请求

关于Retrofit&#xff0c;这个应该不是一个很新颖的东西了&#xff0c;简单过一下吧 1.由Square公司开发&#xff0c;基于Type-safe的REST客户端。 2.使用注解来定义API接口&#xff0c;使得HTTP请求变得简洁且易于维护。 3.支持同步和异步请求&#xff0c;可与RxJava、Corouti…

【安卓13】解决带GMS编译报super分区空间不足错误

1、错误信息 2、解决方案 不同供应商修改分区大小的文件路径不一样&#xff0c;但是万变不离其宗&#xff0c;根据报错信息全局搜索关键词BOARD_SUPER_PARTITION_SIZE 这里以RK供应商和AML供应商修改为例&#xff1a; &#xff08;1&#xff09;RK改法&#xff1a; 根目录下…

全光谱灯对人体的危害?谨记全光谱灯选购要避开的四大套路

全光谱灯对人体的危害有多大&#xff1f;近年来网上关于护眼台灯对视力有害的言论有很多&#xff0c;引发了很多人空前的关注&#xff0c;事实上这未必是一件坏事&#xff0c;因为随着护眼台灯的热度持续上涨&#xff0c;市面上浑水摸鱼的行为增多了不少&#xff0c;有着不少劣…

图论基础知识 并查集/例题

并查集 学习记录自代码随想录 并查集可以解决的问题&#xff1a; 并查集常用来解决连通性问题。 判断两个元素是否在同一个集合里的时候&#xff0c;要想到用并查集。 并查集主要有两个功能&#xff1a; 1.将两个元素添加到一个集合中&#xff1b; 2.判断两个元素在不在同一…

STM32H7使用FileX库BUG,SD卡挂载失败

问题描述&#xff1a; 使用STM32H7ThreadXFileX&#xff0c;之前使用swissbit牌的存储卡可正常使用&#xff0c;最近项目用了金士顿的存储卡&#xff0c;发现无法挂载文件系统。 原因分析&#xff1a; 调试过程发现&#xff0c;关闭D-Cache可以挂载使用exfat文件系统。 File…

QT5.12.12配置MSVC2017编译器环境

QT5.12.12配置MSVC2017编译器环境&#xff1a; &#xff08;失败&#xff0c;转成Mingw&#xff09; 编译器 目前的主流编译器应该是三种。GNU(Gcc,g), Clang/llvm和MSVC。来看一下GPT的回答。 GNU&#xff08;GCC&#xff09;: 优点&#xff1a;   跨平台支持&#xff1…

C# 扩展运算符(...)的详细解析

在C#编程中&#xff0c;扩展运算符&#xff08;…&#xff09;是一种非常有用的特性&#xff0c;它可以将一个数组或集合转换成一个可迭代的序列。扩展运算符在C# 7.0及以后的版本中引入&#xff0c;提供了一种简洁的方式来创建数组、列表或集合的实例&#xff0c;尤其是在需要…

一文看够,植物线粒体基因组分析套路

线粒体堪称生命活动的“能量供给站”&#xff0c;植物线粒体是线粒体基因组研究中难度最高的&#xff0c;其基因组大小差异较大&#xff0c;100kb-10Mb&#xff0c;大部分由非编码DNA序列组成&#xff0c;且有许多同源序列&#xff0c;占基因组总长的2%-60%&#xff0c;基因间区…

制作github.io学术个人主页

制作如图的学术个人主页。About me - Xianwen Ling’s Blog 学术个人主页是一个学者展示个人学术成果和研究方向的重要工具。个人主页可以集中展示学者的研究论文、出版物、演讲和发布的项目等学术成果&#xff0c;这样其他人可以更方便地了解和评估学者的研究贡献。个人主页可…

Maven 安装及配置教程(Windows)【安装】

文章目录 一、 下载1. 官网下载2. 其它渠道 二、 安装三、 配置四、 验证五、 本地仓储配置六、 配置镜像七、 配置JDK八、完整配置九、常用命令十、IDEA 中配置 Maven1. 配置当前项目2. 配置新建 / 新打开 项目 软件 / 环境安装及配置目录 一、 下载 1. 官网下载 安装地址&a…

书生·浦语大模型第二期实战营第七节-OpenCompass 大模型评测实战 笔记和作业

来源&#xff1a; 视频教程&#xff1a;https://www.bilibili.com/video/BV1Pm41127jU/?spm_id_from333.788&vd_sourcef4a51f7f5a63e756f73ad0dff318c1a3 文字教程&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/opencompass/readme.md 作业来源&#x…

【Hadoop】- MapReduce YARN 初体验[9]

目录 提交MapReduce程序至YARN运行 1、提交wordcount示例程序 1.1、先准备words.txt文件上传到hdfs&#xff0c;文件内容如下&#xff1a; 1.2、在hdfs中创建两个文件夹&#xff0c;分别为/input、/output 1.3、将创建好的words.txt文件上传到hdfs中/input 1.4、提交MapR…

HotSpot JVM 中的应用程序/动态类数据共享

0.前言 本文的目的是详细讨论 HotSpot JVM 自 JDK 1.5 以来提供的一项功能&#xff0c;该功能可以减少启动时间&#xff0c;但如果在多个 JVM 之间共享相同的类数据共享 (CDS) 存档&#xff0c;则还可以减少内存占用。 1.类数据共享 (CDS) CDS 的想法是使用特定格式将预处理…

状态模式和策略模式对比

状态模式和策略模式都是行为型设计模式&#xff0c;它们的主要目标都是将变化的行为封装起来&#xff0c;使得程序更加灵活和可维护。之所以将状态模式和策略模式进行比较&#xff0c;主要是因为两个设计模式的类图相似度较高。但是&#xff0c;从状态模式和策略模式的应用场景…

Pulsar Meetup 深圳 2024 会务介绍

“ Hi&#xff0c;各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar Meetup 深圳 2024 报名倒计时啦&#xff0c;快来报名。这里汇集了腾讯、华为和谙流科技等大量 Pulsar 大咖&#xff0c;干货多多&#xff0c;礼品多多&#xff0c;不容错过啊。 ” 活动介绍 由 AscentStream 谙…

Python 0基础_变现_38岁_day 16(文件操作)

在python&#xff0c;使用内置函数open()进行文件的一些读写操作 文件操作格式&#xff1a;open(文件路径&#xff0c;访问模式&#xff0c;字符编码) 前面两个参数是必备参数&#xff0c;后面的字符编码为选填&#xff0c;但是大多数情况下都会协商字符编码 访问模式 r 只读 w…