java算法day20

java算法day20

  • 701.二叉搜索树中的插入操作
  • 450.删除二叉搜索树中的节点
  • 108 将有序数组转换为二叉搜索树

本次的题目都是用递归函数的返回值来完成,多熟悉这样的用法,很方便。
其实我感觉,涉及构造二叉树的题目,用递归函数的返回值来做比较方便。每一层涉及对本层的构造,本层的操作结束后,是通过root.left = dfs(root.left,…)这样的方式来递归。
通过这种方式,到最后一层递归好之后,向上返回,这样树就构建起来了。

701.二叉搜索树中的插入操作

本题的特点是在递归出口。而又由这个递归出口,决定了递归的过程中应该干什么。

核心思路:
按BST的方式进行向下搜索,遇到空的位置就进行插入节点。


难点:
这个处理方式很重要。之前我想的是我干脆弄一个pre节点,这样方便我进行插入。但是这样逻辑就很难写。


所以就只能从递归构造左右子树的角度来做。
我说的构造就是这样
root.left = ?
root.right = ?
这样的方式。这样一旦遇到空,那么创建新节点,返回给上一层。这样root.left或者root.right就直接完成构造了。

所以就按这样的思路来。然后往下搜的时候肯定按BST的性质来往下递归。一旦当前节点大于root.val那么递归右子树。一旦往下层一走刚好碰到null,那么创建新节点,这个创建的新节点刚好就符合规则,挂到了这个正确的位置上。

所以说这样的递归方式已经决定好添加的这个节点的位置了,就等着到这个地方之后进行新节点的 创建。

class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {//递归出口//root为空,表示走到底了,按BST的性质,这个地方正式新节点的所在地,所以返回给上一层if(root==null){TreeNode newNode = new TreeNode(val);return newNode;}//按BST的性质进行往下搜索//但是这里的特点是,不断的构造,最后返回给上一层。是以构造的角度来看if(val>root.val){root.right = insertIntoBST(root.right,val);}else{root.left = insertIntoBST(root.left,val);}return root;}
}

难点就在这种以构造左右子树的角度的题做少了,可能想得到,但是写不出。


解法2:pre指针的思想

我一开始想用的这种做法,但是pre我处理的并不好。
所以从这个题解来学习处理pre节点。
注意这个题是迭代法,也就是用循环了。

class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {//注意这个并不是递归出口,这只是特判if (root == null) return new TreeNode(val);//pre初始化为root。//newRoot是用来后面构造好了返回结果的。TreeNode newRoot = root;TreeNode pre = root;//我个人感觉,怎样才能使得最后的时候,pre和cur一前一后?//技巧:pre的状态变更在一开是就更新为cur,而cur的变更则是在做完操作之后才变更。而且要针对cur做循环跳出的判断,否则到最后的时候,cur又跳进去了,pre会和cur同步。这样cur才会比pre多走一步。//内部的逻辑就是BST的向下搜索过程while (root != null) {pre = root;if (root.val > val) {root = root.left;} else if (root.val < val) {root = root.right;} }//这里就是判断这个新节点是挂在左边还是右边,因为cur只管遇到null就停下来if (pre.val > val) {pre.left = new TreeNode(val);} else {pre.right = new TreeNode(val);}return newRoot;}
}

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

这个就像手算删除二叉树节点的过程。删的时候判断属于哪种类型。
这里就把所有类型做一个判断,符合哪种就完成哪种删除,这就是本题的思路。
有以下五种情况:

第一种情况:没找到删除的节点,遍历到空节点直接返回了
找到删除的节点
第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

第五种比较抽象,但是这就是调整的方式,可以看看下图。
根据BST的性质,就是要把左子树挂到右子树最左下,才符合BST的性质。
请添加图片描述

class Solution {public TreeNode deleteNode(TreeNode root, int key) {//这个情况就属于没搜到,到了最底下就返回了,一直把null带给最顶层。if(root==null){return root;}//每到一个节点就先做判断,是不是要删的节点,不是再按BST往下层走if(root.val==key){//开始分情况讨论了,先拿下比较简单的情况if(root.left == null){//删除的节点,左子树为空,那么就把右子树挂上去,即把右子树返回给上层return root.right;}else if(root.right==null){return root.left;}else{TreeNode cur = root.right;while(cur.left!=null){cur = cur.left;}//此时已经到右子树的最左了,把root的左子树直接挂到cur的左子树上cur.left = root.left;//然后删除当前节点,root直接指向root.right就完成删除了root = root.right;//这里就完成了删除操作,然后返回结果。return root;}}//BST向下搜索构建的过程//这里一定要想清楚,因为是BST,所以往下就一个方向,所以往下递归构建就一个方向,//在每一层要么往左构建,要么往右构建。//key>root.val那往右进行递归到下一层,构建本层的root.rightif(key>root.val){root.right = deleteNode(root.right,key);}else if(key<root.val){root.left = deleteNode(root.left,key);}//这里已经是回来的逻辑了,所以构建的结果要返回给上一层。return root;}
}

108 将有序数组转换为二叉搜索树

题目一旦涉及到数组,那么根据经验,尽量不要重新定义左右区间数组,而是用下标来操作原数组。

本题有个要点,那就要满足平衡二叉搜索树。
因为对于有序数组而言,直接按顺序建一个线性树,那也满足二叉搜索树。
请添加图片描述
那要满足平衡二叉树那该怎么办?
本质是在找分割点。
递归的过程种,每次分割点取数组中间节点,然后递归构建左右子树就行了。
所以一层的子区间可以通过传递下标来完成表示。

class Solution {public TreeNode sortedArrayToBST(int[] nums) {return traversal(nums,0,nums.length-1);}TreeNode traversal(int[] nums,int left,int right){//递归出口,也就是递归构造的过程是区间不断收缩的过程,收缩完了就代表该位置没有节点构造。if(left>right){return null;}//每次取中间节点作为分割点int mid = left+(right-left)/2;//构造新节点TreeNode root = new TreeNode(nums[mid]);//递归构造左右子树,传递子区间。因为节点要取新的区间的中间节点。//这里显然是左闭右闭写法。root.left = traversal(nums,left,mid-1);root.right = traversal(nums,mid+1,right);//构造完了就返回,从底下返回来上,就全都构建好了。return root;}
}

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

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

相关文章

优秀的Linux Shell终端Starship Shell的安装和配置

文章目录 简介安装startship1.安装 starship 二进制文件:2.将初始化脚本添加到您的 shell 的配置文件3、配置4、日志安装字体nerd-fonts编写脚本安装字体Nerd字体全量安装文档简介 Starship是一款轻量、迅速、可无限定制的高颜值终端! Starship Shell是一个用Rust编写的开源…

visio 打开、插入、转换以及保存 DWG 和 DXF (AutoCAD) 绘图

打开、插入、转换以及保存 DWG 和 DXF (AutoCAD) 绘图 Visio 计划 2 Visio Professional 2021 Visio Standard 2021 Visio Professional 2019 更多... 如果要在 Visio 绘图中使用AutoCAD对象&#xff0c;可以使用 Visio 打开它们并将其转换为 Visio 形状。 还可以将 Visio 绘…

图灵测试:人工智能与人类沟通的界限

图灵测试是评估人工智能&#xff08;AI&#xff09;是否能够表现出与人类相似的智能的重要标准之一。它由英国数学家兼计算机科学家艾伦图灵在1950年提出&#xff0c;其核心目的是测试一个机器是否能够表现出类似于人类思维的能力&#xff0c;从而模拟人类的智能。这一测试也因…

汇编语言例题分析

以下数据段定义了如下数据&#xff0c;对应内存图请填空&#xff0c;写出每个内存字节中的2位16进制数&#xff08;注意写准确&#xff0c;2位16进制数&#xff0c;末尾不带h&#xff09;。 Data1 segment x db 1,2,3 y db “ABa” z dw 1,2 Data1 ends 物理地址从0000开始&…

PostgreSQL异常:An I/O error occurred while sending to the backend

在使用PostgreSQL数据库批量写入数据的时候&#xff0c;遇到了一个问题&#xff0c;异常内容如下&#xff1a; Cause: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.报错内容 报错提示1 Caused by: org.postgresql.util.PSQLExc…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-25 ADC模块FEP-DAQ9248采集显示波形方案

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

MTK 安卓14 launcher3修改桌面模式,替换某些应用图标,以及定制化Hotseat

原生的launcher的Hotseat如下图(1)所示,我想把效果改成图(2) 图(1) 图(2) 一:定制化HotSeat 修改的类&#xff1a;packages/apps/Launcher3/com/android/launcher3/Hotseat.java &#xff08;1&#xff09;.修改hotseat的宽 Hotseat------->setInsetsOverridepublic void…

Linux cd 和 pwd 命令

目录 1. 更改工作目录 cd 2. 查看当前工作目录 pwd 1. 更改工作目录 cd 打开虚拟机终端的时候&#xff0c;以用户的家目录为默认工作目录&#xff1b; 更多时候需要更改当前的工作目录&#xff08;Change Directory&#xff09;, 语法&#xff1a;cd 【Linux路径】 没有参数…

Java 22 中的4个永久特性

功能处于孵化或预览阶段是什么意思&#xff1f; 实际上&#xff0c;这是向 Java 编程语言添加新功能的新过程&#xff0c;Java 社区使用这种过程来在 API 和工具处于早期实验阶段时从社区获得反馈&#xff08;孵化功能&#xff09;或已经完全指定但尚未永久的阶段&#xff08;…

塔子哥的快乐值-小红书2024笔试(codefun2000)

题目链接 塔子哥的快乐值-小红书2024笔试(codefun2000) 题目内容 塔子哥有许多生活琐事。已知他生活中有n个事件&#xff0c;解决第i个事件需要他花费ti的时间和hi的精力&#xff0c;并能获得ai 的快乐值。 塔子哥想知道&#xff0c;在总花费时间不超过T且总花费精力不超过H的…

操作系统如何高效处理网络请求:IO多路复用技术

在处理大量请求时&#xff0c;各个引擎都会采用线程池的方法&#xff0c;并发处理这些请求&#xff0c;但当一万个请求来的时候&#xff0c;我们要创建一万个线程来处理吗&#xff0c;很显然不会&#xff0c;那假如我创建一千个线程&#xff0c;那一线程该如何处理这个十个请求…

3GPP R18 Multi-USIM是怎么回事?(四)

前几篇主要是MUSIM feature NAS 部分内容的总结,这篇开始看RRC部分相关的内容,由于RRC部分内容过长,也分成了2篇。这篇就着重看下musim gap以及RRC触发UE离开RRC Connected mode相关的内容,直入正题, 上面的内容在overview中有提到,对应的是如下38.300中的描述。 处于网络…

Python -numpy 基础-------1

NumPy&#xff08;Numerical Python&#xff09;是Python的一个开源数值计算扩展库。它支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。NumPy的数组&#xff08;ndarray&#xff09;对象是一个快速且灵活的多维数组对象&#xff0c;用于存储…

黑龙江等保测评最新资讯:强化安全基线,赋能数字未来

在黑龙江省&#xff0c;随着数字化转型的不断深化&#xff0c;企业对其信息安全的关注也越来越高&#xff0c;而作为保护信息资产的一个重要环节的等保测评&#xff0c;也面临着新的机遇和挑战。 最新政策动向 最近&#xff0c;有关部门下发了《关于加强网络安全等级保护的指导…

基于3D开发引擎HOOPS平台的大型三维PLM系统的设计、开发与应用

产品生命周期管理&#xff08;Product Lifecycle Management&#xff0c;PLM&#xff09;系统在现代制造业中扮演着至关重要的角色。随着工业4.0和智能制造的推进&#xff0c;PLM系统从最初的CAD和PDM系统发展到现在的全面集成、协作和智能化的平台。本文将探讨基于HOOPS平台的…

【python】Numpy运行报错分析:IndexError与形状不匹配问题

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

森林防火,森林防火智能储水罐_鼎跃安全

森林防火是保护森林的重要措施&#xff0c;每年发生的森林火灾都严重威胁着自然安全&#xff0c;对社会经济和生态造成严重的破坏。为了切实有效地预防并扑灭森林火灾&#xff0c;森林防火智能储水罐已成为现代森林防火体系中的重要装备。 储水罐内置传感器和控制系统&#xff…

【CTFWP】ctfshow-web32

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 题目介绍&#xff1a;题目分析&#xff1a;payload&#xff1a;payload解释&#xff1a;flag 题目介绍&#xff1a; <?php/* # -*- coding: utf-8 -*- # Autho…

【每日刷题Day85】

【每日刷题Day85】 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 2. 43. 字符串相乘 - 力扣&#xff08;L…

DC系列靶场---DC 2靶场的渗透测试(二)

漏洞利用及探测 rbash逃逸 虽然我们现在已经可以执行切换路径命令了&#xff0c;但是发现还有是很多命令不能用。 我想看看一下目标主机的所有用户&#xff0c;是不能执行的。 那我们就用到了当前shell逃逸。第一种情况&#xff1a;/ 被允许的情况下&#xff1b;直接 /bin/s…