二叉树——700.二叉搜索树中的搜索

简介: 本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助

1 题目描述

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-in-a-binary-search-tree

2 题目示例

image.png

image.png

3 题目提示

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

4 思路

方法一:递归
二叉搜索树满足如下性质:

  • 左子树所有节点的元素值均小于根的元素值;
  • 右子树所有节点的元素值均大于根的元素值。

据此可以得到如下算法:

  • 若root为空则返回空节点;
  • 若val = root.val,则返回root;
  • 若val < root.val,递归左子树;
  • 若val > root.val,递归右子树。

复杂度分析

  • 时间复杂度:O(N),其中N是二叉搜索树的节点数。最坏情况下二叉搜索树是—条链,且要找的元素比链末尾的元素值还要小(大),这种情况下我们需要递归N次
  • 空间复杂度:O(N)。最坏情况下递归需要O(N)的栈空间。

方法二:迭代
我们将方法—的递归改成迭代写法:

  • 若root为空则跳出循环,并返回空节点;
  • 若val= root.val,则返回root;
  • 若val <root.val,将root置为root.left;
  • 若val > root.val,将root置为root.right。

复杂度分析

  • 时间复杂度:O(N),其中N是二叉搜索树的节点数。最坏情况下二叉搜索树是—条链,且要找的元素比链末尾的元素值还要小(大),这种情况下我们需要迭代Ⅳ次
  • 空间复杂度:O(1)。没有使用额外的空间。

5 我的答案

递归:

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if (root == null) {
            return null;
        }
        if (val == root.val) {
            return root;
        }
        return searchBST(val < root.val ? root.left : root.right, val);
    }
}

迭代:

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        while (root != null) {
            if (val == root.val) {
                return root;
            }
            root = val < root.val ? root.left : root.right;
        }
        return null;
    }
}
相关文章
|
设计模式 JSON 架构师
你真的需要防腐层吗?DDD 系统间的7种关系梳理与实践
当提到系统间交互的时候,人们都会想到大名鼎鼎的防腐层,用来防止其他系统的模型变更对本系统造成影响。但是在实践这个模式的过程中,我们常常会遇到问题。此时我们也应该考虑下其他的系统交互方式。
27687 12
你真的需要防腐层吗?DDD 系统间的7种关系梳理与实践
|
12月前
|
关系型数据库 MySQL Linux
Linux系统绿色安装MySQL 8.0.39
Linux系统绿色安装MySQL 8.0.39
|
Java 测试技术
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
255 0
|
Linux TensorFlow 算法框架/工具
windows编译TensorFlowServing
windows编译TensorFlowServing
215 1
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
195 3
|
缓存 Java Go
Go mod包依赖管理工具使用详解
Go mod包依赖管理工具使用详解
663 0
Go mod包依赖管理工具使用详解
|
消息中间件 Java RocketMQ
【Java】最新版本SpringCloudStream整合RocketMQ实现单项目中事件的发布与监听
【Java】最新版本SpringCloudStream整合RocketMQ实现单项目中事件的发布与监听
942 0
|
存储 SQL 关系型数据库
小白带你学习linux SQL语句(二十八)
小白带你学习linux SQL语句(二十八)
147 0