代码随想录:二叉树22-24

目录

700.二叉搜索树的搜索

题目

代码(二叉搜索树迭代)

代码(二叉搜索树递归)

代码(普通二叉树递归)

代码(普通二叉树迭代)

98.验证二叉搜索树

题目

代码(中序递归得到中序序列)

代码(中序迭代得到中序序列)

代码(中序递归)

代码(中序迭代)

530.二叉搜索树的最小绝对差

题目

代码(中序递归得到中序序列)

代码(中序迭代得到中序序列)

代码(中序迭代)

代码(中序递归)


700.二叉搜索树的搜索

题目

给定二叉搜索树(BST)的根节点 root 和一个整数值 val

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

示例 1:

输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]

代码(二叉搜索树迭代)

class Solution {public TreeNode searchBST(TreeNode root, int val) {while(root != null){//值相等,直接返回节点if(root.val == val){return root;}//target小,往左子树走else if(root.val > val){root = root.left;}//targer大,往右子树走else if(root.val < val){root = root.right;}}//最后root走到空,说明没找到return null;}
}

代码(二叉搜索树递归)

class Solution {public TreeNode searchBST(TreeNode root, int val) {//终止条件if(root == null){return null;}if(root.val == val){return root;}//单层逻辑if(root.val > val){return searchBST(root.left,val);  //目标小,往左子树走}//这里要用else,不然报错没有返回值else{return searchBST(root.right,val); //目标大,往右子树走}}
}

代码(普通二叉树递归)

class Solution {public TreeNode searchBST(TreeNode root, int val) {//终止条件if(root == null || root.val == val){return root;}//单层逻辑(前序遍历)TreeNode left = searchBST(root.left,val);TreeNode right = searchBST(root.right,val);if(left != null){return left;}else{return right;}}
}

代码(普通二叉树迭代)

class Solution {public TreeNode searchBST(TreeNode root, int val) {Stack<TreeNode> stack = new Stack<>();if(root == null){return null;}stack.push(root);while(!stack.isEmpty()){TreeNode cur = stack.pop();;if(cur.val == val){return cur;}if(cur.right != null){stack.push(cur.right);}if(cur.left != null){stack.push(cur.left);}}return null;}
}

98.验证二叉搜索树

题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

代码(中序递归得到中序序列)

class Solution {public boolean isValidBST(TreeNode root) {List<Integer> list = new ArrayList<>();if(root == null){return true;}inOrder(root,list); //获取中序遍历序列listfor(int i=1;i < list.size();i++){if(list.get(i) <= list.get(i-1)){  //判断list是否递增return false;}}//list递增,返回truereturn true;}//中序递归二叉树,list存储中序遍历序列public void inOrder(TreeNode root,List<Integer> list){//终止条件if(root == null){return;}//单层逻辑inOrder(root.left,list);  //递归左子树list.add(root.val); //处理中间节点inOrder(root.right,list); //递归右子树}
}

代码(中序迭代得到中序序列)

class Solution {public boolean isValidBST(TreeNode root) {List<Integer> list = new ArrayList<>();if(root == null){return true;}//中序迭代遍历得到中序序列Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while(cur != null || !stack.isEmpty()){//cur非空,一直走到左子树最下while(cur != null){stack.push(cur);cur = cur.left;}//cur为空,最左下节点出栈cur = stack.pop();  list.add(cur.val);cur = cur.right;}for(int i=1;i < list.size();i++){if(list.get(i) <= list.get(i-1)){  //判断list是否递增return false;}}//list递增,返回truereturn true;}
}

代码(中序递归)

class Solution {//核心是pre的设计,pre代表中序序列下root的前一个节点//判断中间节点root时,root必须大于pre的值TreeNode pre = null;  //pre初始化为空,之后就一直指向root的前一个中序节点public boolean isValidBST(TreeNode root) {//终止条件if(root == null){return true;}//单层逻辑boolean left = isValidBST(root.left);  //判断左子树是否满足//判断中间节点root是否比左子树的都大,pre是左子树最大节点if(pre != null && root.val <= pre.val){return false; }pre = root;  //更新pre,指向中间节点boolean right = isValidBST(root.right);  //判断右子树是否满足return left && right;  //左右子树同时满足}
}

代码(中序迭代)

class Solution {//核心是pre的设计,pre代表中序序列下root的前一个节点//判断中间节点root时,root必须大于pre的值TreeNode pre = null;  //pre初始化为空,之后就一直指向root的前一个中序节点public boolean isValidBST(TreeNode root) {//终止条件if(root == null){return true;}//中序迭代Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;TreeNode pre = null;  //增加pre,指向root的前一个节点while(cur != null || !stack.isEmpty()){//cur非空一直往左子树走while(cur != null){stack.push(cur);cur = cur.left;}//cur为空,最左下节点出栈cur = stack.pop();if(pre != null && pre.val >= cur.val){return false;}pre = cur;cur = cur.right;  //往右子树走}return true;}
}

530.二叉搜索树的最小绝对差

题目

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

输入:root = [4,2,6,1,3]
输出:1

代码(中序递归得到中序序列)

class Solution {public int getMinimumDifference(TreeNode root) {List<Integer> list = new ArrayList<>();inOrder(root,list);int min = Integer.MAX_VALUE;for(int i=1;i < list.size();i++){int abs = list.get(i) - list.get(i-1);if(abs < min){min = abs;}}return min;}//中序递归得到中序序列listpublic void inOrder(TreeNode root,List<Integer> list){if(root == null){return;}inOrder(root.left,list);list.add(root.val);inOrder(root.right,list);}
}

代码(中序迭代得到中序序列)

class Solution {public int getMinimumDifference(TreeNode root) {List<Integer> list = new ArrayList<>();inOrder(root,list);int min = Integer.MAX_VALUE;for(int i=1;i < list.size();i++){int abs = list.get(i) - list.get(i-1);if(abs < min){min = abs;}}return min;}//中序遍历得到中序序列listpublic void inOrder(TreeNode root,List<Integer> list){Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while(cur != null || !stack.isEmpty()){while(cur != null){stack.push(cur);cur = cur.left;}cur = stack.pop();list.add(cur.val);cur = cur.right;}}
}

代码(中序迭代)

class Solution {public int getMinimumDifference(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode pre = null;  //代表cur的前一个中序节点TreeNode cur = root;int result = Integer.MAX_VALUE;  //初始化最大值while(cur != null || !stack.isEmpty()){while(cur != null){stack.push(cur);cur = cur.left;}cur = stack.pop();//更新最小值if(pre != null){int abs = cur.val - pre.val;if(abs < result){result = abs;}}pre = cur;cur = cur.right;}return result;}
}

代码(中序递归)

class Solution {TreeNode pre = null;  //pre指向中序序列的前一个节点int result = Integer.MAX_VALUE;  //初始化resultpublic int getMinimumDifference(TreeNode root) {//终止条件if(root == null){return result;}//单层逻辑result = getMinimumDifference(root.left);  //获取左边的最小值//获取中间节点的最小值if(pre != null){int abs = root.val - pre.val;if(abs < result){result = abs;}}pre = root;result = getMinimumDifference(root.right); //获取右边的最小值return result;}
}

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

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

相关文章

oracle rman restore database的时候报错RMAN-06023: 没有找到数据文件1的副本来还原

一 问题描述 在oracle异地备份恢复测试数据库上执行restore database的时候报错&#xff1a; RMAN-06023: 没有找到数据文件1的副本来还原 可是我看备份明明都是存在的&#xff0c;而且已经执行了catalog start with命令。 有点奇怪的是catalog start with的时候&#xff0c…

牛客NC143 矩阵乘法【中等 矩阵 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/bf358c3ac73e491585943bac94e309b0 思路 矩阵算法在图像处理、神经网络、模式识别等领域有着广泛的用途。在矩阵乘法中&#xff0c;A矩阵和B矩阵可以做乘法运算必须满足A矩阵的列的数量等于B矩阵的行的数量。运算…

d13(126-129)-勇敢开始Java,咖啡拯救人生

目录 Arrays类 数组中存储对象时 排序 在要比较的类中public class 类名 implements Comparable <类名> Comparator JDK8新特性&#xff1a;Lambda表达式 Lambda表达式的省略写法 方法引用 静态方法引用 实例方法引用 特定类型的方法引用 构造器引用 医院挂号系…

FANUC机器人SOCKET连接指令编写

一、创建一个.KL文件编写连接指令 创建一个KL文本来编写FANUC机器人socket连接指令 二、KAREL指令代码 fanuc机器人karel编辑器编辑的karel代码如下&#xff1a; PROGRAM SM_CON %COMMENT SOCKET连接 %STACKSIZE 4000 --堆栈大小 %INCLUDE klevccdfVAR status,data_type,in…

【draw.io的使用心得介绍】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

OpenHarmony实战开发-使用SmartPerf-Host分析应用性能

简介 SmartPerf-Host是一款深入挖掘数据、细粒度展示数据的性能功耗调优工具&#xff0c;可采集CPU调度、频点、进程线程时间片、堆内存、帧率等数据&#xff0c;采集的数据通过泳道图清晰地呈现给开发者&#xff0c;同时通过GUI以可视化的方式进行分析。该工具当前为开发者提…

2024第十五届蓝桥杯网络安全赛项WriteUp

欢迎关注公众号【Real返璞归真】回复【蓝桥杯2024】获取完整题目附件。 排名 安全知识 错1个选择题&#xff0c;题目说的不清楚&#xff0c;没搞懂题意。肯定不能用eval。错了理论题有点遗憾。 没想到这题前端是要解析json数据&#xff0c;排除CD选了A&#xff0c;结果发现正…

每日一题(力扣45):跳跃游戏2--贪心

由于题目已经告诉了我们一定可以跳到&#xff0c;所以我们只需去考虑前进最快的方法。即 判断当前下一步能跳的各个位置中&#xff0c;哪个能带你去去向最远的地方&#xff08;why&#xff1f; 因为其他位置所能提供的最大范围都没最远那个大&#xff0c;所以最远的那个已经可以…

嵌入式Linux学习——Ubantu初体验

Ubuntu 和Windows 的最大差别 Windows中的每一个分区都对应着一个盘符&#xff0c;盘符下可以存放目录与文件&#xff0c;而在Ubantu中没有盘符的概念&#xff0c;只有目录结构。实际上不同的目录可能挂载在不同的分区之下&#xff0c;如果想要查看当前目录位于磁盘的哪个分区…

【服务器部署篇】Jenkins配置后端工程自动化部署

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

Transformer实战 单词预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、定义模型 from tempfile import Tempor…

ruoyi-nbcio-plus基于vue3的flowable为了适配文件上传改造VForm3的代码记录

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

java如何使用webService方式调用对接第三方平台

实际使用记录&#xff0c;做个记录&#xff1a; 1、需要对方提供wsdl文件,该文件中有接口的Ip地址&#xff0c;方法名、参数等详细信息&#xff0c; wsdl文档中targetNamespace为命名空间 <xsd:element name"searchBGDMIInfo">标签中name是方法名&#xff1…

数据结构-树和森林之间的转化

从树的二叉链表的定义可知&#xff0c;任何一棵和树对应的二叉树&#xff0c;其根节点的右子树必为空。这里我们举三个树&#xff0c;将这个由三个树组成的森林组成二叉树是这个样子的。 下面我们说明一下详细过程&#xff0c;首先将每个树转化为二叉的状态&#xff0c;如图所示…

NAT网络地址转换实验(华为)

思科设备参考&#xff1a;NAT网络地址转换实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 NAT&#xff08;Network Address Translation&#xff09;&#xff0c;即网络地址转换技术&#xff0c;是一种在现代计算机网络中广泛应用的技术&#xff0c;主要用于有效管…

汇编语言(详解)

汇编语言安装指南 第一步&#xff1a;在github上下载汇编语言的安装包 网址&#xff1a;GitHub - HaiPenglai/bilibili_assembly: B站-汇编语言-pdf、代码、环境等资料B站-汇编语言-pdf、代码、环境等资料. Contribute to HaiPenglai/bilibili_assembly development by creat…

李廉洋:4.27黄金原油下周一行情分析及走势策略。

金价将出现六周来的首次单周下跌&#xff0c;因投资者在金价上涨数月后获利了结。自2月中旬的低点以来&#xff0c;金价已经上涨了约17%&#xff0c;尽管对美联储放松政策的预期正在减弱&#xff0c;但金价仍屡创新高。周五公布的最新通胀数据强化了高利率将暂时维持的观点。“…

MATLAB的几种边缘检测算子(Sobel、Prewitt、Laplacian)

MATLAB的几种边缘检测算子(Sobel、Prewitt、Laplacian) clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;% 读取图像 image imread(lena.png); % 转换为灰度图像 gray_image rgb2gray(image); % 转换为double类型以进行计算…

Git泄露和hg泄露原理理解和题目实操

一.Git泄露 1.简介 Git是一个开源的分布式版本控制系统&#xff0c;它可以实现有效控制应用版本&#xff0c;但是在一旦在代码发布的时候&#xff0c;存在不规范的操作及配置&#xff0c;就很可能将源代码泄露出去。那么&#xff0c;一旦攻击者发现这个问题之后&#xff0c;就…

论文速览 | IEEE Symposium on Security and Privacy (SP), 2023 | FMCW雷达反射阵列欺骗攻击

注1:本文系"计算成像最新论文速览"系列之一,致力于简洁清晰地介绍、解读非视距成像领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, SIGGRAPH, TPAMI; Light‑Science & Applications, Optica 等)。 本次介绍的论文是:<I…