代码随想录:二叉树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.hqwc.cn/news/651775.html

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

相关文章

【linux高性能服务器编程】项目实战——仿QQ聊天程序源码剖析

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之项目实战——仿QQ聊天程序源码剖析&#xff0c;在这篇文章中&#xff0c;你将会学习到如何利用Linux网络编程技术来实现一个简单的聊天程序&#xff0c;并且我会给出源码进行剖析&#xff…

解决NetworkManager覆盖/etc/resolv.conf的问题

发布时间&#xff1a;2024.4.27 问题 /etc/resolv.conf是Linux下DNS的配置文件。 但是NetworkManager会用覆盖它&#xff0c;导致我们每次都要重新配置。 解决办法 这是官方推荐的做法。或者你可以用resolveconf工具。 $ nm-connection-editor会调起一个界面&#xff0c;…

HWOD:提取不重复的整数

一、知识点 不要看到题目是和整数的位相关的&#xff0c;就下意识用求余的操作去获得整数的每一位 这里用getchar()直接读取了整数的每一位 代码中k是往后走的 二、题目 1、描述 输入一个 int 型整数&#xff0c;按照从右向左的阅读顺序&#xff0c;返回一个不含重复数字…

SQL异常

异常 EXCEPTION 预定义异常 系统已经设置好的异常&#xff0c;包含了异常名&#xff0c;异常代码&#xff0c;异常信息组成 CASE NOT FOUND 未知异常&#xff1a;OTHERS 异常信息&#xff1a;SQLERRM 错误代码&#xff1a;SQLCODE 有各种各样的很多异常 捕获异常的语法 DE…

uniapp获取当前位置及检测授权状态

uniapp获取当前位置及检测授权定位权限 文章目录 uniapp获取当前位置及检测授权定位权限效果图创建js文件permission.jslocation.js 使用 效果图 Android设备 点击 “设置”&#xff0c;跳转应用信息&#xff0c;打开“权限即可”&#xff1b; 创建js文件 permission.js 新建…

Blender点操作

顶点操作即一般的“布线”操作 1.顶点移动 -先切到顶点模式 -移动&#xff0c;G 或 G X/Y/Z -旋转&#xff0c;R 同上 -缩放&#xff0c;S 同上 2.顶点滑移&#xff0c;用于微调顶点的位置 快捷键&#xff1a;Shift V&#xff0c;G G 3.顶点删除 -选中一个顶点 -按…

二 SSM整合实操

SSM整合实操 一 依赖管理 数据库准备 mysql8.0.33 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUE…

基于Rust的多线程 Web 服务器

构建多线程 Web 服务器 在 socket 上监听 TCP 连接解析少量的 HTTP 请求创建一个合适的 HTTP 响应使用线程池改进服务器的吞吐量优雅的停机和清理注意&#xff1a;并不是最佳实践 创建项目 ~/rust ➜ cargo new helloCreated binary (application) hello package~/rust ➜ma…

mysql的多表查询和子查询

多表查询&#xff1a;查询数据时&#xff0c;需要使用多张表来查询 多表查询分类&#xff1a; 1.内连接查询 2.外连接查询 3.子查询 笛卡尔积&#xff1a; create table class (id int primary key auto_increment,name varchar(10) ); create table student (id int primar…

Vue 组件单元测试深度探索:细致解析与实战范例大全

Vue.js作为一款广受欢迎的前端框架&#xff0c;以其声明式的数据绑定、组件化开发和灵活的生态系统赢得了广大开发者的心。然而&#xff0c;随着项目规模的增长&#xff0c;确保组件的稳定性和可靠性变得愈发关键。单元测试作为软件质量的守护神&#xff0c;为Vue组件的开发过程…

uniapp-css多颜色渐变:左右+上下

案例展示 案例代码&#xff1a; 代码灵感&#xff1a;使用伪类进行处理 <view class"headBox"></view>.headBox {height: 200rpx;background: linear-gradient(to right, #D3D5F0, #F0DCF3, #F7F6FB, #DAE8F2, #E1D3EE);position: relative; }.headBox…

数据结构:时间复杂度和空间复杂度

目录 1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 推导大O阶方法3.4 常见时间复杂度计算举例 3.空间复杂度 1. 如何衡量一个算法的好坏 下面求斐波那契数列的算法好还是不好&#xff0c;为什么&#xff1f;该如何衡量一个算…