12.14_黑马数据结构与算法笔记Java

news2024/11/13 10:32:44

目录

120 二叉搜索树 min max

121 二叉搜索树 put

122 二叉搜索树 前任后任1

123 二叉搜索树 前任后任2

124 二叉搜索树 删除1

125 二叉搜索树 删除2

126 二叉搜索树 删除3

127 二叉搜索树 删除 递归1

128 二叉搜索树 删除 递归2

129 二叉搜索树 范围查询

130 二叉搜索树 e01-e03 删增查

131 二叉搜索树 e04 判断合法 中序非递归

132 二叉搜索树 e04 判断合法 中序递归1

133 二叉搜索树 e04 判断合法 中序递归2

134 二叉搜索树 e04 判断合法 上下界

135 二叉搜索树 e05 求范围和

136 二叉搜索树 e06 根据前序遍历结果建树1

137 二叉搜索树 e06 根据前序遍历结果建树2

138 二叉搜索树 e06 根据前序遍历结果建树3

139 二叉搜索树 e07 最近公共祖先

140 avl树 概述

141 avl树 高度和平衡因子

142 avl 四种失衡情况

143 avl 旋转


120 二叉搜索树 min max

递归代码

非递归代码

121 二叉搜索树 put

122 二叉搜索树 前任后任1

123 二叉搜索树 前任后任2

124 二叉搜索树 删除1

125 二叉搜索树 删除2

126 二叉搜索树 删除3

127 二叉搜索树 删除 递归1

意思是:假如我要删除的是6,那我现在就要将7返回,然后让4指向7,这样就断开了4和6的连接,那就可以删除6了。

因此,通俗来说,就是将要删除的节点的孩子返回,然后让删除节点的父母指向要删除的节点的孩子。 

这一部分的代码是找出要删除的节点。因为如果node.key=key就走到后面的代码去了,就不会在着三个if走。 

这一部分的代码意思是,拿原先给的图片来做例子

来一个伪递归

private BSTNode doDelete(BSTNode node,int key){
//比如我要删除的是6   key=6
if(node == null){
return null;
}
if(key < node.key){ 
node.left = doDelete(node.left,key);
return node;
} 
if(key> node.key){  6>4
node.right =    private BSTNode doDelete(BSTNode node,int key){//现在传进来的是4的右孩子也就是6,而且6没有左孩子,因此,直接走下面这几行代码
if(node.left == null){
return node.right; //这里的意思是返回6的右孩子,也就是7
} 



/

return node;
} 
if(node.left == null){
return node.right;
} 
if(node.right == null){
return node.left;
}
}

下一步

private BSTNode doDelete(BSTNode node,int key){
//比如我要删除的是6   key=6
if(node == null){
return null;
}
if(key < node.key){ 
node.left = doDelete(node.left,key);
return node;
} 
if(key> node.key){  6>4
node.right =    private BSTNode doDelete(BSTNode node,int key){//现在传进来的是4的右孩子也就是6,而且6没有左孩子,因此,直接走下面这几行代码
if(node.left == null){
return 7


/

return node;
} 
if(node.left == null){
return node.right;
} 
if(node.right == null){
return node.left;
}
}

下一步

private BSTNode doDelete(BSTNode node,int key){
//比如我要删除的是6   key=6
if(node == null){
return null;
}
if(key < node.key){ 
node.left = doDelete(node.left,key);
return node;
} 
if(key> node.key){  6>4
node.right =7

/

return node;
} 
if(node.left == null){
return node.right;
} 
if(node.right == null){
return node.left;
}
}

 下一步

private BSTNode doDelete(BSTNode node,int key){
//比如我要删除的是6   key=6
if(node == null){
return null;
}
if(key < node.key){ 
node.left = doDelete(node.left,key);
return node;
} 
if(key> node.key){
node.right =7
return node;//返回6 这个删除的节点
} 
if(node.left == null){
return node.right;
} 
if(node.right == null){
return node.left;
}
}

而这个时候。因为node.right =7了,因此,树已经连接好,就是被删除节点的父母已经找到了要删除节点的孩子,也意味着6已经被删除了,因为已经没有人和它牵手了。

这里的作用是:连接被删除节点的孩子们和被删除节点的父母的关系 

 

128 二叉搜索树 删除 递归2

node是指要删除的节点

node 是4,node.right 是5,因此s是5,进入循环,找到node的右孩子的左孩子 

让原来node(被删除节点的左孩子全部托付给s,也就是托付给5) 

 

 

 可是如果要删除的节点和根节点之间有距离,需要再加一些步骤。

那这个时候就有疑问了,那会不会和没有距离的那些情况搞混淆了?不会的,他这里就是加了一步递归,实际上就是做了一次无用功。还是拿刚才的例子做说明。

node 是4       s是5

我这里传进去的都是5,而且5只有右孩子,因此,doDelete这个方法中它直接走下面这行代码 。return的就是6

 

所以,s.right 还是等于6,因此没有改变任何东西,只是做了无用功。 

回归正题,如果就是根节点和被删除节点之间就是隔了很多的元素,那代码解读应该如下 :

先解释一下图片的含义:4是被删节点,5是要后继节点。首先先将5拿开,让6和7进行相连接,然后再删除4,让5替代4的位置。因为如果倒数第二行和倒数第三行的代码调换过来的话,就会导致图片1的5那里有两个孩子,增加麻烦。

好的,我们来解释一下代码:

将4的右节点也就是8和4的后继节点也就是5传入doDelete,也就是将以8为树根的这棵树传进去,删掉5,之前的伪代码演示中可以发现doDelete可以删除5操作。因此就从图一转换为图二

node.left是2,将这个2这个孩子交给s,成为s也就是5的做左孩子。

 

129 二叉搜索树 范围查询

但是,对于greater方法来说,如果用正着来遍历的话,就得把所有都遍历完,但如果采用反向遍历,就不需要。因此,优化代码:

最终完整的代码:

因为最后的最后返回的是被删除节点,因此,要创建一个集合来收集被删除元素,而被删除元素又只有一个,因此,取【0】即可以。

 

130 二叉搜索树 e01-e03 删增查

递归有一些缺点就是,做了一些不必要的操作,比如我要新增1,但是在递归的过程中,又把已经连接好的5和2又连接一次。 

 

131 二叉搜索树 e04 判断合法 中序非递归

Long的最小值小于整数的最小值。 

 

132 二叉搜索树 e04 判断合法 中序递归1

进行优化,以下:

解释一下为什么是在boolean a 下面添加if判断:因为isValidBST (node.left )传进去的是6的left,也就是传进去的3,因此,a的真假是说明3是否符合条件。那既然3不符合的话,直接返回false就好了,就没有必要还去比较6这个值了。 这种行为也叫做剪枝。

 

如果是这样,该怎么遍历呢?直接从8开始。

红色的是来,黑色(深紫色也算黑色,当时搞错颜色了而已)的是回。

一层层走。

133 二叉搜索树 e04 判断合法 中序递归2

局部变量在一个方法中发生了改变,不会影响其他的方法。因此要把它放到全局去看

第一种修改方式:

第二种修改方式:

创建一个对象,而不是一个变量。Long和Integer都不行,它们的值不可以发生改变,一定要AtomicLong,因为它可以改变。

一些小方法:

 

 

134 二叉搜索树 e04 判断合法 上下界

135 二叉搜索树 e05 求范围和

 

第二种方法:伪递归来一次

红色的是来,绿色的是回,紫色的是最后一步

136 二叉搜索树 e06 根据前序遍历结果建树1

137 二叉搜索树 e06 根据前序遍历结果建树2

 

理解:

先拿个8过来,确立好的左限和右限,然后拿5。5小于8,可以做为8的左孩子。然后拿1,1小于5,可以做5的左孩子。然后拿7, 7大于5,因此,1的左右孩子为null,完毕。然后拿10。10超过了5的上限,因此5完毕。。以此类推。。

 

138 二叉搜索树 e06 根据前序遍历结果建树3

 

139 二叉搜索树 e07 最近公共祖先

 

140 avl树 概述

导致失衡的原因:删除,添加。

141 avl树 高度和平衡因子

 

142 avl 四种失衡情况

对于LL和RR只要做一次旋转:

LL:失衡点向右旋转一次

RR:失衡点向左旋转一次 

对于LR和RL要做两次旋转:

LR:先让失衡点的右孩子左旋转,再让失衡点右旋转

RL:先让失衡点的左孩子右旋转,再让失衡点左旋转

143 avl 旋转

要先更新红色节点才能更新黄色节点,要先将下面的高度算好,才可以算上面的高度,这样才会准确。

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

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

相关文章

KUKA机器人如何隐藏程序或程序段?

KUKA机器人如何隐藏程序或程序段? 如下图所示,新建一个示例程序进行说明, 如下图所示,如果红框中的动作指令不想让别人看到,想隐藏起来,如何做到? 如下图所示,在想要隐藏的程序或程序段的前后,分别添加 ;fold 和 endfold指令(这里要注意是英文状态下的输入法), 如…

国标GB28181安防监控系统/磁盘阵列EasyCVR(V.3.4)新亮点:免保活功能

TSINGSEE青犀近日发布了EasyCVR安防管理平台的V.3.4版本&#xff0c;其中一大亮点就是很多朋友都在咨询的“免保活”功能&#xff0c;那么&#xff0c;什么是“免保活”功能&#xff1f;又该如何配置呢&#xff1f; 在EasyCVR平台有个【按需直播】按钮&#xff0c;顾名思义&…

如何部署Portainer容器管理工具+cpolar内网穿透实现公网访问管理界面

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

大象elephant目标检测数据集VOC+YOLO格式2300张

大象是长鼻目象科的哺乳动物&#xff0c;有两个属&#xff0c;是世界上最大的陆生动物。其像柱子一样的四肢和宽厚的脚掌可以稳稳支撑住庞大的身体。巨大的头上长有蒲扇状的大耳朵和长且有弹性的鼻子。象耳上有丰富的血管&#xff0c;可以有效散热。鼻子和上唇合而为一的象鼻由…

YB9225是一种固定工作频率的高效率电流模式升压转换器。

YB9225B 1.2 MHz。峰值5A 电流&#xff0c;升压转换器 概述 &#xff1a; YB9225是一种固定工作频率的高效率电流模式升压转换器。YB9225集成了一个非常低的 Rds-on NMOSFTET&#xff0c;以减少功率损耗和实现高效率。最高效率可达93% 。功率 MOSFET 的峰值电流限制在5 A。1.…

网站使用CDN后无法获取用户真实IP的解决方法

宝塔或Nginx环境 如果你使用的宝塔或Nginx&#xff0c;可以在宝塔面板或Nginx中&#xff0c;找到配置文件增加如下代码后&#xff0c;重载配置或者重启 Nginx 即可&#xff1a; #CDN获取真实ip set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; PHP语言函数方法…

36、什么是池化算法

池化算法也是 CNN 网络中非常常见的算法。 池化这一算法理解起来比较简单,从名字中或许可以看到一些东西:从一个像素池子中选取一些有代表性的像素出来。 常见的池化有最大池化和平均池化。最大池化就是从像素池子中选取最大值出来,而平均池化就是从像素池子中选取平均值出…

HTML---初识CSS

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.CSS概念 CSS是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用于描述HTML文档外观样式的标记语言。通过CSS&#xff0c;开发者可以在不改变HTML标记结构的情况…

机器学习 | 机器学习基础知识

一、机器学习是什么 计算机从数据中学习规律并改善自身进行预测的过程。 二、数据集 1、最常用的公开数据集 2、结构化数据与非结构化数据 三、任务地图 1、分类任务 Classification 已知样本特征判断样本类别二分类、多分类、多标签分类 二分类&#xff1a;垃圾邮件分类、图像…

【数据结构入门精讲 | 第一篇】打开数据结构之门

数据结构与算法是计算机科学中的核心概念&#xff0c;也与现实生活如算法岗息息相关。鉴于全网数据结构文章良莠不齐且集成度不高&#xff0c;故开设本专栏&#xff0c;为初学者提供指引。 目录 基本概念数据结构为何面世算法基本数据类型抽象数据类型使用抽象数据类型的好处 数…

利用Pytorch预训练模型进行图像分类

Use Pre-trained models for Image Classification. # This post is rectified on the base of https://learnopencv.com/pytorch-for-beginners-image-classification-using-pre-trained-models/# And we have re-orginaized the code script.预训练模型(Pre-trained models)…

【SpringBoot】进阶之自定义starter(一起了解自定义starter的魅力)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发》。&#x1f3af;&#x1f3af;…

解决设备能耗管理问题,易点易动来帮忙!

设备能耗管理是现代企业可持续发展的重要环节&#xff0c;然而&#xff0c;许多企业在设备能耗管理方面面临一系列问题&#xff1a; 能耗数据收集困难&#xff1a;企业需要监控和管理大量设备的能耗情况&#xff0c;但传统的手动方式收集能耗数据耗时耗力&#xff0c;无法实时获…

Python中的TesserOCR:文字识别的全方位指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 文字识别在图像处理领域中起到了至关重要的作用&#xff0c;而TesserOCR&#xff08;Tesseract OCR的Python封装&#xff09;为开发者提供了一个强大的工具&#xff0c;使得文字识别变得更加便捷。本文将通过详细…

电声器件是什么

电声器件 电子元器件百科 文章目录 电声器件前言一、电声器件是什么二、电声器件的类别三、电声器件的应用实例四、电声器件的作用原理总结前言 电声器件在多种应用中起着重要作用,如家庭娱乐系统、音响设备、通信设备、汽车音响、舞台表演、声音检测和录音等领域。它们的设计…

新版Spring Security6.2案例 - Authentication用户名密码

前言&#xff1a; 前面有翻译了新版Spring Security6.2架构&#xff0c;包括总体架构&#xff0c;Authentication和Authorization&#xff0c;感兴趣可以直接点链接&#xff0c;这篇翻译官网给出的关于Authentication的Username/Password这页。 首先呢&#xff0c;官网就直接…

RHEL7.5编译openssl1.1.1w源码包到rpm包

openssl1.1.1w下载地址 https://www.openssl.org/source/ 安装依赖包 yum -y install curl which make gcc perl perl-WWW-Curl rpm-build wget http://mirrors.aliyun.com/centos-vault/7.5.1804/os/x86_64/Packages/perl-WWW-Curl-4.15-13.el7.x86_64.rpm rpm -ivh pe…

tuxera2023破解版免费下载 NTFS for Mac读写工具(附序列号)

Tuxera ntfs 2023 破解安装包是一个mac读写ntfs磁盘工具允许您访问&#xff0c;它允许您访问NFTS 驱动器上的文件。 该应用程序提供访问访问Mac 设备中NFTS 格式文件的驱动力&#xff0c;因此您有权基于格式文件进行无困难的访问Windows 数据。 在发生电力灾难或断电时使用防损…

重新认识Word——给图、表、公式等自动编号

重新认识Word——给图、表、公式等自动编号 给图增加题注题注失败的情况给图添加“如图xx-xx所示” 给公式插入题注第一步——先加题注第二步——设置两个制表符 解决题注“图一-1”的问题 前面我们已经学习了如何引用多级列表自动编号了&#xff0c;现在我们有第二个问题&…

汽车清除积碳和清洗节气门

汽车清除积碳和清洗节气门 汽车需要清除积碳的部位检查积碳方法&#xff1a; 清除积碳和清洗节气门风险&#xff1a;燃油宝 第一次清除积碳1万公里2万公里3万公里--5万公里6万公里以上 汽车需要清除积碳的部位 节气门喷油嘴进气道燃烧室 检查积碳方法&#xff1a; 建议每3到5…