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

目录

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 旋转

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ADC学习总结

ADC的架构分类&#xff1a; 1、Delta-Sigma 采样率一般是在1M以内&#xff0c;位数一般可以做的很高&#xff0c;比如24位&#xff0c;Delta-Sigma ADC采用了过采样技术&#xff0c;不需要在模拟输入端加抗混叠滤波&#xff0c;由后端数字滤波器进行处理&#xff0c;通过信噪…

网工内推 | IT经理,50k*14薪,NP以上即可,七险一金

01 海天瑞声 招聘岗位&#xff1a;IT经理 职责描述&#xff1a; 1、IT基础架构的方案制定、实施和日常维护&#xff0c;包括机房建设运维、服务器配置及运维、网络规划及运维、上网行为管理、电话、电话、监控、门禁等各类弱电系统搭建及运维 2、负责公司环境及网络安全防御体…

WEB服务器介绍

Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器连到服务器上并请求文件时&#xff0c;服务器将处理该请求并将文件发送到该浏览器上&#xff0c;附带的信息会告诉浏览器如何查看该文件&#xff0c;即文WEB服务器件类型。服务器使用HTTP进行信息交流&#xff0c…

ASF-YOLO开源 | SSFF融合+TPE编码+CPAM注意力,精度提升!

目录 摘要 1 Introduction 2 Related work 2.1 Cell instance segmentation 2.2 Improved YOLO for instance segmentation 3 The proposed ASF-YOLO model 3.1 Overall architecture 3.2 Scale sequence feature fusion module 3.3 Triple feature encoding module …

Kvaser Leaf v3 重磅上新!报文速率高达20000条/秒!支持CAN FD!EAN: 73-30130-01424-4

作为CAN总线领域的专家&#xff0c;Kvaser深耕行业40年&#xff0c;至今已经累计推出100多款CAN产品。其中稳定小巧、便携易用的Kvaser经典Leaf系列是将计算机与CAN网络连接并获取CAN/CAN FD数据的最简单、性价比最高的方法之一。Kvaser秉持着将用户放在重要位置的原则&#xf…

6.5.编解码器信息的收集

那在上节课中呢&#xff1f;我向你介绍了add track相关的内容&#xff0c;那今天呢&#xff1f;我们来看看编解码器信息的收集。那在这里呢&#xff0c;我们需要问几个重要的问题&#xff0c;那首先呢&#xff0c;就是我们上节课通过&#xff0c;可以让web rtc知道我们都要传输…

智能优化算法应用:基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.旗鱼算法4.实验参数设定5.算法结果6.参考文献7.MA…

优先考虑静态成员类

在Java中&#xff0c;静态成员类&#xff08;static nested class&#xff09;是一种嵌套在另一个类中的类&#xff0c;且被声明为静态。静态成员类不依赖于外部类的实例&#xff0c;可以直接通过外部类的类名来访问。 优先考虑使用静态成员类的情况通常是当这个类与外部类的实…

一文带你了解UI自动化测试框架

PythonSeleniumUnittestDdtHTMLReport分布式数据驱动自动化测试框架结构 1、Business&#xff1a;公共业务模块&#xff0c;如登录模块&#xff0c;可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_page import Login_Page from H…

探秘闭包:隐藏在函数背后的小秘密(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

C# 图解教程 第5版 —— 第17章 转换

文章目录 17.1 什么是转换17.2 隐式转换17.3 显示转换和强制转换17.4 转换的类型17.5 数字的转换17.5.1 隐式数字转换17.5.2 溢出检测上下文17.5.3 显示数字转换 17.6 引用转换17.6.1 隐式引用转换17.6.2 显式引用转换17.6.3 有效显式引用转换 17.7 装箱转换17.7.1 装箱是创建副…

小程序 -网络请求post/get

1.1网络请求的概念(post和get) 1.2步骤 1.3 应用函数 js里面写&#xff0c;用bindtap绑在控件上&#xff0c;就不讲了 实例代码&#xff1a; //发起get数据请求get_info(){wx.request({url:https://www.escook.cn/api/get,//请求的接口地址,必须基于https协议//请求的方式met…

SpringBoot的Starter自动化配置,自己编写配置maven依赖且使用及短信发送案例

目录 一、Starter机制 1. 是什么 2. 有什么用 3. 应用场景 二、短信发送案例 1. 创建 2. 配置 3. 编写 4. 形成依赖 6. 其他项目的使用 每篇一获 一、Starter机制 1. 是什么 SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂…

【五】Python 代理模式

文章目录 5.1 代理模式概述5.1.1 代理介绍5.1.2 代理模式的作用 5.2 代理模式的UML类图5.3 了解不同类型的代理5.3.1虚拟代理5.3.2 远程代理5.3.3 保护代理5.3.4 智能代理 5.4 现实世界中的代理模式5.5 代理模式的优点5.6 门面模式和代理模式之间的比较 5.1 代理模式概述 5.1.…

卷积神经网络(含案例代码)

概述 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一类专门用于处理具有网格结构数据的神经网络。它主要被设计用来识别和提取图像中的特征&#xff0c;但在许多其他领域也取得了成功&#xff0c;例如自然语言处理中的文本分类任务。 C…

Paper Reading: (CCVC) 基于冲突的半监督语义分割跨视图一致性

目录 简介目标/动机工作重点方法CVC: 跨视图一致性CPL: 基于冲突的伪标记 实验设置comparison with SOTAAblation 总结 简介 题目&#xff1a;《Conflict-Based Cross-View Consistency for Semi-Supervised Semantic Segmentation》&#xff0c; CVPR’23, 基于冲突的半监督语…

HPM5300系列--第二篇 Visual Studio Code开发环境以及多种调试器调试模式

一、目的 在博文《HPM5300系列--第一篇 命令行开发调试环境搭建》、《HPM6750系列--第四篇 搭建Visual Studio Code开发调试环境》中我们介绍了命令行方式开发环境&#xff0c;也介绍了HPM6750evkmini开发板如何使用Visual Studio Code进行开发调试&#xff08;其中调试方式使用…

AcWing 338. 计数问题

文章目录 题目描述问题分析代码 题目描述 AcWing 338.计数问题 给定两个整数 a a a 和 b b b, 求 a a a 和 b b b中所有数字中0~9的出现次数 数据范围&#xff1a; 0 < a, b < 100000000 输入格式&#xff1a; 输入包含多组测试数据。 每组测试数据占一行&#xff0c;包…

AI会干掉美图秀秀们吗?

网上流传着这样一个传说&#xff0c;亚洲有三大“邪术”&#xff0c;韩国整容术、日本化妆术&#xff0c;还有震惊世界的中国PS 术。虽然是网友的戏称&#xff0c;但也反映了PS美图技术在国内盛行一时。 而说起美图技术就不得不提到美图公司&#xff0c;但美图公司近些年的日子…

影视动画行业发展现状与方向:AI技术推动动画工业化体系新变革

工业化体系 是国产动画强国的必经之路 中国动画的百年历程不仅是创作者们展现艺术才华的历程&#xff0c;也是一代代中国动画人不懈追求动画工业体系建设的历程。 为什么现在的中国动画需要建立工业化体系呢&#xff1f; 举个例子&#xff0c;在建立工业化体系之前&#xff…