当前位置: 首页 > news >正文

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

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

1、题目

题目链接:700. 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

示例 1:
image.png

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

示例 2:
image.png

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

提示:

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

2、递归

思路

二叉搜索树是一个有序树,满足以下性质:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

据此可以得到如下算法:
若 root 为空则返回空节点;
若 val = root.val,则返回 root;
若 val < root.val,递归左子树;
若 val > root.val,递归右子树。

  1. 确定递归函数的参数和返回值

递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。
代码如下:

TreeNode* searchBST(TreeNode* root, int val)
  1. 确定终止条件

如果root为空,或者找到这个数值了,就返回root节点。

if (root == nullptr || root->val == val) {return root;
}
  1. 确定单层递归的逻辑

看看二叉搜索树的单层递归逻辑有何不同。
因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。
如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回 nullptr。
代码如下:

TreeNode* result = nullptr;
if (root->val > val) result = searchBST(root->left, val);
if (root->val < val) result = searchBST(root->right, val);
return result;

代码

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if (root == nullptr || root->val == val) {return root;}// 如果根节点的值大于目标值,则在左子树中继续搜索if (root->val > val) {return searchBST(root->left, val);} else {// 如果根节点的值小于目标值,则在右子树中继续搜索return searchBST(root->right, val);}}
};

复杂度分析

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

3、迭代法

思路

我们将方法一的递归改成迭代写法:
若 root 为空则跳出循环,并返回空节点;
若 val=root.val,则返回 root;
若 val<root.val,将 root 置为 root.left;
若 val>root.val,将 root 置为 root.right。

代码

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {while (root != nullptr) {if (root->val > val) {root = root->left;} else if (root->val < val) {root = root->right;} else {return root;}}return nullptr;}
};

复杂度分析

  • 时间复杂度: O(n)
  • 空间复杂度: O(1)
http://www.lryc.cn/news/348296.html

相关文章:

  • 程序设计实践-课程设计任务布置(麦当劳) (price 200)(不包含文档)
  • leetcode 918.环形子数组的最大和
  • Spring中用到的设计模式有哪些
  • CSS 样式清单整理:文字超出部分显示省略号和设置placeholder的字体样式
  • Docker容器:Docker-Consul 的容器服务更新与发现
  • 容器化Jenkins远程发布java应用(方式二:自定义镜像仓库远程拉取构建)
  • 解密某游戏的数据加密
  • 【报错合集】完美解决“虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本”
  • YOLOv8小白中的小白安装环境教程!没一个字废话,看一遍不踩坑!
  • C#正则表达式,提取信息使用
  • 【数据结构】详解队列
  • 大模型微调方法汇总
  • 探究NVMe SSD HMB应用场景与影响-<续>
  • YTU 3166 共享单车 DFS 记忆化搜索
  • RAG应用中的路由模式
  • 运维:SSH常用命令简介
  • Springboot+Vue项目-基于Java+MySQL的流浪动物管理系统(附源码+演示视频+LW)
  • 力扣刷题:四数相加Ⅱ
  • 如果通过Glide 设置图片圆角
  • Chatgpt学习技巧
  • [初学rust] 06_rust 元组
  • 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (四)
  • C++进阶:哈希(1)
  • 第三节课,功能2:开发后端用户的管理接口-- postman--debug测试
  • Docker-compsoe部署prysm-beacon-chain + geth服务(geth版本v1.14.0)
  • 前端人员如何理解进程和线程
  • Linux下网络命令
  • Php swoole和mqtt
  • Spring STOMP-连接到消息代理
  • Excel中的`MMULT`函数