【力扣题解】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.hqwc.cn/news/317573.html

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

相关文章

Python 面向对象之绑定和非绑定方法

Python 面向对象之绑定和非绑定方法 【一】序言 在Python类的成员中分为两类&#xff1a;一个是属性&#xff0c;另一个就是方法&#xff08;就是定义的函数&#xff09;方法又分为两大类&#xff1a;绑定方法&#xff08;动态方法&#xff09;和非绑定方法&#xff08;静态方…

RocketMQ5.0消息过滤

前言 消费者订阅了某个主题后&#xff0c;RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息&#xff0c;可通过设置过滤条件在 Broker 端进行过滤&#xff0c;只获取到需要关注的消息子集&#xff0c;避免接收到大量无效的消息。 以电商交易场景为例…

海外住宅IP代理的工作原理和应用场景分析,新手必看

海外住宅IP代理作为一种技术解决方案&#xff0c;为用户提供了访问全球网络资源和维护隐私安全的方法。本文将介绍海外住宅IP代理的工作原理和应用场景&#xff0c;帮助读者更好地理解和利用这一技术。 一、工作原理 海外住宅IP代理的工作原理基于代理服务器和IP地址的转发。它…

Docker实战02|Namespace

在上一文《Docker实战01&#xff5c;容器与开发语言》中主要介绍了Docker的基本概念与Docker安装、Go语言安装等实战技巧。 本文继续针对Namespace技术展开讲解并利用Go语言进行实践。 本系列所有代码均已经开源。关公众号回复「Go语言实现Docker」即可获得。 目录 2.1.2 U…

Spring ApplicationEvent事件处理

Spring的事件 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现&#xff0c;内部实现原理是观察者设计模式&#xff0c;设计初衷也是为了系统业务逻辑之间的解耦&#xff0c;提高可扩展性以及可维护性。 ApplicationEvent就是Spring的事件接口Applic…

谷歌推出创新SynCLR技术:借助AI生成的数据实现高效图像建模,开启自我训练新纪元!

谷歌推出了一种创新性的合成图像框架&#xff0c;这一框架独特之处在于它完全不依赖真实数据。这个框架首先从合成的图像标题开始&#xff0c;然后基于这些标题生成相应的图像。接下来&#xff0c;通过对比学习的技术进行深度学习&#xff0c;从而训练出能够精准识别和理解这些…

leetcode:1464. 数组中两元素的最大乘积(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums&#xff0c;请你选择数组的两个不同下标 i 和 j&#xff0c;使 (nums[i]-1)*(nums[j]-1) 取得最大值。 请你计算并返回该式的最大值。 示例 1&#xff1a; 输入&#xff1a;nums [3,4,5,2] 输出&#xff1a;12 解释&#xff1a;如…

海外静态IP和动态IP有什么区别?推荐哪种?

什么是静态ip、动态ip&#xff0c;二者有什么区别&#xff1f;哪种好&#xff1f;关于这个问题&#xff0c;不难发现&#xff0c;在知道、知乎上面的解释有很多&#xff0c;但据小编的发现&#xff0c;这些回答都是关于静态ip和动态ip的专业术语解释&#xff0c;普通非专业人事…

一、初识Redis与分布式系统

目录 一、Redis应用 二、实现方式 三、Redis应用 四、分布式系统 五、分布式系统实现 1、应用服务和数据库服务分离 2、引入负载均衡&#xff0c;应用服务器集群&#xff08;解决高并发&#xff09; 3、引入读写分离&#xff0c;数据库主从结构&#xff08;解决高并发&a…

CentOS 7 实战指南:文本处理命令详解

前言 在Linux系统中&#xff0c;文本处理是非常基础却又必不可少的一项技能。如果你正在使用CentOS系统&#xff0c;那么学会如何利用文本操作命令来高效地处理文本文件无疑将会是一个强有力的工具。 本篇文章将介绍一些最常用和最实用的文本操作命令&#xff0c;并通过详尽的…

为什么要用扫码出入库?

一、什么是扫码出入库管理系统 传统的仓库管理模式存在很多问题&#xff0c;如&#xff1a;货物积压、过期、丢失等。这些问题不仅影响了企业的正常运营&#xff0c;还给企业带来了经济损失。为了解决这些问题&#xff0c;扫码出入库管理系统应运而生。该系统采用先进的二维码…

利用蚁剑钓鱼上线CS

前言 ​ 中国蚁剑使用Electron构建客户端软件&#xff0c;Electron实现上用的是Node.js&#xff0c;并且Node.js能执行系统命令&#xff0c;故可以利用蚁剑的webshell页面嵌入js来直接执行命令&#xff0c;进而钓鱼来上线CS。&#xff08;类似Goby&#xff0c;Goby也是使用Ele…