【力扣题解】P700-二叉搜索树中的搜索-Java题解

花无缺

👨‍💻博客主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创

收录于专栏 【力扣题解】


文章目录

  • 【力扣题解】P700-二叉搜索树中的搜索-Java题解
    • 🌏题目描述
    • 💡题解
    • 🌏总结


【力扣题解】P700-二叉搜索树中的搜索-Java题解

P700. 二叉搜索树中的搜索

🌏题目描述

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

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

示例 1:

在这里插入图片描述

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

示例 2:

在这里插入图片描述

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

提示:

  • 树中节点数在 [1, 5000] 范围内
  • 1 <= Node.val <= 107
  • root 是二叉搜索树
  • 1 <= val <= 107

💡题解

递归

public TreeNode searchBST(TreeNode root, int val) {// 节点为空, 说明没有搜索到 val 值, 返回 nullif (root == null) {return null;}// val 等于当前节点值, 返回当前节点if (root.val == val) {return root;}// 如果 val 比当前节点值小, 就搜索左子树if (val < root.val) {return searchBST(root.left, val);}// 如果 val 比当前节点值大, 就搜索右子树return searchBST(root.right, val);
}

利用栈迭代

public TreeNode searchBST(TreeNode root, int val) {// 根节点为空, 返回 nullif (root == null) {return null;}// 根节点值就等于 val, 返回根节点if (root.val == val) {return root;}// 使用栈遍历树Deque<TreeNode> stack = new LinkedList<>();stack.offerLast(root);while (!stack.isEmpty()) {TreeNode node = stack.pollLast();// 当前节点值等于 val, 直接返回当前节点if (node.val == val) {return node;}// 左右子节点进栈if (node.left != null) {stack.offerLast(node.left);}if (node.right != null) {stack.offerLast(node.right);}}// 搜索完整个二叉搜索树都没有找到 val 值, 返回 nullreturn null;
}

利用二叉搜索树的特性迭代

public TreeNode searchBST(TreeNode root, int val) {// 当前节点不为空while (root != null) {// val 小于当前节点值if (root.val > val) {// 搜索左子树root = root.left;//     val 大于当前节点值} else if (root.val < val) {// 搜索右子树root = root.right;//     val 等于当前节点值, 直接返回当前节点} else {return root;}}// 当前节点为空, 说明没有搜索到 val 值, 返回 nullreturn null;
}

时间复杂度均为O(n),需要遍历 n 个二叉搜索树的节点,n <= 二叉搜索树的节点数。

🌏总结

这个题我们可以直接使用递归轻松的做出来,而且也可以使用迭代,但是本题除了使用常规的用栈模拟递归来迭代之外,我们还可以有更加简单的迭代法,那就是利用二叉搜索树的特性,二叉搜索树左子树上所有结点的值均小于它的根结点的值,二叉搜索树右子树上所有结点的值均大于它的根结点的值,而且它的所有子树都是二叉搜索树。根据这个特性,我们就不需要使用栈来迭代,而直接根据当前节点的左右子节点的大小来进行迭代,这样会更加的简单高效。

作者:花无缺(huawuque404.com)


🌸欢迎关注我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
🍻一起进步-刷题专栏:【力扣题解】
🥇往期精彩好文:
📢【CSS选择器全解指南】
📢【HTML万字详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容的最大动力!
谢谢!

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

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

相关文章

2024年,独立建站过渡SASS建站,你准备好了吗?

在这个数字时代&#xff0c;一个充满活力的网站对于企业和个人来说都是非常重要的。独立建站是一个非常不错的选择&#xff0c;但是过渡到SASS建站可以更方便地达到成功。 SASS建站不仅为您提供业界领先的技术和创意设计&#xff0c;还可以让您轻松管理您的网站内容。同时&…

智慧园区物联综合管理平台之架构简述

总体架构 系统总体划分为物联感知系统层、 核心平台层、 综合运营服务平台和展示层四部分。 物联感知系统层 物联感知系统主要是支撑园区智能化运行的各子系统, 包括门禁系统、 视频监控系统、 车辆管理系统等。 核心平台层 核心平台层包括: 园区物联综合管理平台和园区…

x-cmd pkg | gum - 很好看的终端 UI 命令行工具

目录 简介首次用户功能特点Bubbles 与 Lip Gloss进一步探索 简介 gum 由 Charm 组织于 2022 年使用 Go 语言开发。旨在帮助用户编写 Shell 脚本与 dotfiles 时提供一系列快捷使用&#xff0c;可配置&#xff0c;可交互&#xff0c;美观的 Terminal UI 组件。 首次用户 使用 x…

[Angular] 笔记 25:指令

组件指令 (chatgpt 回答) 在 Angular 中&#xff0c;组件本身可以被视为指令&#xff0c;这种指令被称为组件指令。组件是 Angular 应用的构建块之一&#xff0c;它封装了一段具有特定功能和特性的用户界面&#xff0c;并且可以在应用中重复使用。 组件指令具有以下特征&…

代码随想Day53 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 本题和 718. 最长重复子数组 的区别就是本题不要求连续&#xff0c;所以在两个字符不相等的时候&#xff0c;逻辑不相同&#xff0c;当不相同的时候&#xff0c;需要找到dp[i-1][j]和dp[i][j-1]之间的最大值&#xff0c;因为不相等的时候需要找出退而求上…

【python爬虫】xpath使用说明

XPath 可以在XML文档中查找信息,支持HTML,可以用来提取信息。可以把标签文本看作一个树状图&#xff0c;最顶层是html&#xff0c;第二层是head和body&#xff0c;body的下面是许多div&#xff0c;每个div可以用/[属性属性名]来进一步细分&#xff0c;也可以通过/属性来获取对应…

Debezium日常分享系列之:重新选择列

Debezium系列之&#xff1a;重新选择列 一、介绍 仅 SQL 数据库连接器支持此后处理器。在某些情况下&#xff0c;由于某些源数据库的工作方式&#xff0c;当 Debezium 连接器发出更改事件时&#xff0c;该事件可能会排除特定列类型的值。例如&#xff0c;PostgreSQL 中的 TOA…

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…

Docker九 | Swarm mode

目录 Swarm基本概念 节点 服务和任务 创建Swarm集群 创建管理节点 增加工作节点 查看集群 部署服务 新建服务 查看服务 服务伸缩 增加服务 减少服务 删除服务 Swarm基本概念 节点 节点分为管理节点(manager)和工作节点(worker) 管理节点 管理节点用于Swarm集群的…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK里函数来获取相机当前数据吞吐量&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在NEOAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过NEOAPISDK获…

Django 学习教程-介绍与安装

系列 Django 学习教程-第一个 Django 应用-CSDN博客 介绍 Django 是一个高级 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。 它由经验丰富的开发人员构建&#xff0c;解决了 Web 开发的大部分麻烦&#xff0c;因此您可以专注于在编写应用程序时无需重新发…

自定义事件

自定义事件 自定义事件 AAA"fn1"&#xff1a;向子组件的事件池中注入AAA事件&#xff0c;方法是父组件的fn1 发布订阅&#xff1a;子组件某个操作把父组件中的某个方法执行了 参数可以传多个 $listeners* $listeners&#xff1a;事件池中的方法 { aaa:fn1, bbb:fn2 }…

RestClient操作索引库_创建索引库(二)

ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c; 通过http请求发送给ES。 官方文档地址: https://www.elastic.co/quide/en/elasticsearch/client/index.html 目录 一、初始化JavaRestClient 1.1.依赖引入 1.2.初始化…

关于k8s

Kubernetes&#xff08;通常被称为K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由Google开发&#xff0c;并于2014年发布为开源项目&#xff0c;现在由云原生计算基金会&#xff08;CNCF&#xff09;负责维护。 Kub…

JS-图片预览

方法一 用URL.createObjectURL()将一个file或Blob类型的对象转为UTF-16的字符串 objectURL URL.createObjectURL(Fileobject); URL.createObjectURL()静态方法会创建一个 DOMString&#xff0c;其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中…

java代码配置连接OPCUA

pom依赖如下 <dependency><groupId>org.eclipse.milo</groupId><artifactId>sdk-client</artifactId><version>0.6.9</version> </dependency><dependency><groupId>org.eclipse.milo</groupId><artifa…

举例说明计算机视觉(CV)技术的优势和挑战

高效性&#xff1a;计算机视觉技术可以处理大量的图像和视频数据&#xff0c;并快速地从中提取有用的信息。它可以在几秒钟内完成复杂的图像处理任务&#xff0c;而这些任务对于人类来说可能需要很长时间才能完成。精确性&#xff1a;计算机视觉技术可以准确地识别和分析图像中…

Mybatis枚举类型处理和类型处理器

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

C++ 具名要求-基本概念-指定该类型对象可以默认构造

指定该类型对象可以默认构造 要求 以下情况下&#xff0c;类型 T 满足可默认构造 (DefaultConstructible) &#xff1a; 给定 任意标识符 u&#xff0c; 下列表达式必须合法且拥有其指定的效果 表达式后条件T u对象 u 被默认初始化。T u{}对象 u 被值初始化或聚合初始化。…

MySQL之复合查询

目录 单表查询回顾 多表查询 自连接 子查询 在from子句中使用子查询 合并查询 单表查询回顾 在讲解多表查询前&#xff0c;我们先回顾一下单表查询&#xff0c;这是因为多表查询本质上依然是单表查询&#xff08;其原因在下文中讲解多表查询时再说明&#xff09;&#x…