二叉搜索树操作题目:二叉搜索树中的搜索操作

news2024/9/29 13:23:42

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:二叉搜索树中的搜索操作

出处:700. 二叉搜索树中的搜索操作

难度

2 级

题目描述

要求

给定二叉搜索树的根结点 root \texttt{root} root 和一个整数值 val \texttt{val} val

在二叉搜索树中找到结点值等于 val \texttt{val} val 的结点并返回以该结点为根的子树。如果该结点不存在,返回 null \texttt{null} null

示例

示例 1:

示例 1

输入: root   =   [4,2,7,1,3],   val   =   2 \texttt{root = [4,2,7,1,3], val = 2} root = [4,2,7,1,3], val = 2
输出: [2,1,3] \texttt{[2,1,3]} [2,1,3]

示例 2:

示例 2

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

数据范围

  • 树中结点数目在范围 [1,   5000] \texttt{[1, 5000]} [1, 5000]
  • 1 ≤ Node.val ≤ 10 7 \texttt{1} \le \texttt{Node.val} \le \texttt{10}^\texttt{7} 1Node.val107
  • root \texttt{root} root 是二叉搜索树
  • 1 ≤ val ≤ 10 7 \texttt{1} \le \texttt{val} \le \texttt{10}^\texttt{7} 1val107

解法一

思路和算法

根据二叉搜索树的性质,空二叉树是二叉搜索树,对于非空二叉搜索树,根结点的左子树中的每一个结点的值都小于根结点的值,根结点的右子树中的每一个结点的值都大于根结点的值,且根结点的左子树和右子树也是二叉搜索树。

首先比较根结点值和目标值。如果根结点值和目标值相等,则根结点即为目标结点,将根结点返回。如果根结点值和目标值不相等,执行如下操作。

  • 如果根结点值大于目标值,则只有根结点的左子树中可能存在目标值,因此在根结点的左子树中搜索。

  • 如果根结点值小于目标值,则只有根结点的右子树中可能存在目标值,因此在根结点的右子树中搜索。

搜索过程中,如果当前子树为空,则一定不存在结点值等于目标值的结点,此时返回空树。

上述过程是一个递归的过程。递归的终止条件是当前结点为空或者当前结点值等于目标值,此时返回当前结点。对于其余情况,定位到可能存在目标值的子树,对该子树调用递归。

代码

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

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。时间复杂度取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)

解法二

思路和算法

递归实现可以改成迭代实现。从根结点开始搜索,如果当前结点不为空且当前结点值和目标值不相等,则执行如下操作,直到当前结点为空或者当前结点值和目标值相等。

  • 如果当前结点值大于目标值,则只有当前结点的左子树中可能存在目标值,因此将当前结点移动到左子结点。

  • 如果当前结点值小于目标值,则只有当前结点的右子树中可能存在目标值,因此将当前结点移动到右子结点。

搜索结束时,如果目标结点存在,则当前结点为目标结点,否则当前结点为空结点。因此当搜索结束时,返回当前结点。

代码

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        TreeNode node = root;
        while (node != null && node.val != val) {
            if (node.val > val) {
                node = node.left;
            } else {
                node = node.right;
            }
        }
        return node;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。时间复杂度取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

【java】6案例演示

关键字的定义和特点: 定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串(单词) 特点:关键字中所有字母都为小写 保留字介绍 Java 保留字:现有 Java 版本尚未使用,但以后版本可…

Effective C++——关于重载赋值运算

令operator返回一个*this的引用 在重载,,*等运算符时&#xff0c;令其返回一个指向this的引用。 class MyClass {int* val; public:MyClass(int i) : val(new int(i)){}MyClass():val(new int(0)){}void print() {cout << *val << endl;}MyClass& operator(co…

【pytorch框架】使用 PyTorch 进行深度学习

1.Pytorch介绍 PyTorch 是由 Facebook 创建和发布的用于深度学习计算的 Python 库。它起源于早期的库 Torch 7&#xff0c;但完全重写。 它是两个最受欢迎的深度学习库之一。PyTorch 是一个完整的库&#xff0c;能够训练深度学习模型以及在推理模式下运行模型&#xff0c;并支…

Vue3 watch与watchEffect区别

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

Unity中UGUI在Mask剪裁粒子特效的实现

在Unity使用Mask是剪裁不了粒子特效的&#xff0c;之前有想过RenderTexture来实现&#xff0c;不过使用RenderTexture不适合用于很多个特效&#xff0c;因为RenderTexture依赖Camera的照射&#xff0c;如果在背包中每种道具都有不同的特效&#xff0c;那使用RenderTexture则需要…

255:vue+openlayers 加载tomtom地图(多种形式)

第255个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加tomtom地图,这里包含了多种形式,诸如中文标记、英文标记、白天地图、晚上地图、卫星影像图,高山海拔地形图等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

基于SpringBoot + vue 的旅游景区网站系统设计与实现

目录 一、需求分析 二、技术分析 三、功能分析 四、数据设计 五、界面展示 六、资源获取 一、需求分析 旅游推荐网站是指提供旅游相关信息、服务和建议的在线平台。这些网站旨在帮助用户规划和安排旅行&#xff0c;提供目的地信息、酒店预订、机票预订、租车服务、旅行建…

v42.循环控制语句breakcontinue

1.break 跟在if语句、Switch语句之后 跳出循环 2.continue 例如打印0--20的质数程序。此循环为for循环&#xff1a; 初始化后判断条件&#xff0c;执行完代码块&#xff0c;i的值必定会递增!⚠️ 循环的是if语句和printf函数。如果满足if语句 &#xff0c;那么continue跳过当…

【视野提升】ChatGPT的系统是如何工作的?

类似ChatGPT的系统是如何工作的&#xff1f; 我们试图在下图中解释它是如何工作的。这个过程可以分为两个部分。 训练 要训练一个ChatGPT模型&#xff0c;有两个阶段&#xff1a; 预训练 在这个阶段&#xff0c;我们在大量互联网数据上训练一个GPT模型&#xff08;仅解码器转…

配置环境变量—使用cmd打开QQ

1.windowsR输入cmd打开命令窗口&#xff0c;输入qq点击回车&#xff0c;不能正常运行&#xff0c;因为没有配置环境变量 2.鼠标右键点击QQ&#xff0c;打开文件所在位置&#xff0c;找到QQ.exe文件 3.点击上方复制路径 开始配置环境变量。 1.选中此电脑&#xff0c;鼠标右击&a…

css中>>>、/deep/、::v-deep的作用和区别,element-ui自定义样式

文章目录 一、前言1.1、/deep/1.2、::v-deep1.3、>>> 二、区别三、总结四、最后 一、前言 1.1、/deep/ 在style经常用scoped属性实现组件的私有化时&#xff0c;要改变element-ui某个深层元素&#xff08;例如.el-input__inner&#xff09;或其他深层样式时&#xf…

C++ Qt day2

自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <io…

vue3-elementPlus部分组件样式修改

前提&#xff1a;在less语言下使用/deep/&#xff1b;在sass语言下使用 ::v-deep 替换 /deep/ 但::v-deep的写法已经废弃&#xff0c;建议使用:deep(css选择器) elementUI样式修改&#xff1a;vue2-elementUI部分组件样式修改_vue2 圆圈选中样式-CSDN博客 el-dropdown //下拉…

照片上的杂物怎么清除?这两个方法很好用

随着智能手机的普及和拍照技术的发展&#xff0c;我们经常会在社交媒体上分享自己的照片。然而&#xff0c;有时候拍摄的照片中会包含一些不必要的杂物&#xff0c;如电线、垃圾、阴影等&#xff0c;这些杂物会影响照片的美观度和视觉效果。这时候我们就需要借助工具来帮我们清…

ISA server2006 URL中文 报500错误

我在运维一个10几年前的老项目&#xff0c;有一个问题&#xff0c;一直困扰着我的客户。很久都没有解决。 表现就是在用中文搜索表单时&#xff0c;会看到如下的错误&#xff1a; 后来经过我的测试发现&#xff0c;只要是GET请求中传参包含中文时就必然出现这个报错。 探索…

Linux部署幻兽帕鲁服务器,PalWorld开服联机教程,保姆级教程

Linux系统搭建PalWorld私服&#xff0c;幻兽帕鲁开服联机教程&#xff0c;保姆级教程 最近这游戏挺火&#xff0c;很多人想跟朋友联机&#xff0c;如果有专用服务器&#xff0c;就不需要房主一直开着电脑&#xff0c;稳定性也好得多。 幻兽帕鲁简介 《幻兽帕鲁》是一款游戏作…

hdu1195 Open the lock 双向广度优先搜索

D-BFS 双向广度优先搜索 从起点和终点同时开始搜索&#xff0c;直到两个搜索的点相交&#xff0c;得到最短路径 Code: // D-BFS //by:MuQY #include <iostream> #include <algorithm> #include <string.h> #include <queue> #include <string> …

《WebKit 技术内幕》学习之十三(1):移动WebKit

1 触控和手势事件 1.1 HTML5规范 随着电容屏幕的流行&#xff0c;触控操作变得前所未有的流行起来。时至今日&#xff0c;带有多点触控功能已经成为了移动设备的标准配置&#xff0c;基于触控的手势识别技术也获得巨大的发展&#xff0c;如使用两个手指来缩放应用的大小等。…

【多线程】ThreadLocal 详解,举例说明

不理解多线程的同学可先了解多线程理论篇【多线程】线程是什么&#xff1f;多线程为什么&#xff1f;怎么做&#xff1f;通俗易懂讲解多线程 以及多线程进阶篇【多线程】多线程安全&#xff0c;为什么不安全&#xff0c;要怎么做保证其安全&#xff0c;实例 1、ThreadLocal是什…

快速入门Playwright框架:从零到自动化测试的第一步

Playwright框架&#xff1a; 背景介绍&#xff1a; ​ Playwright 是微软开发的 Web应用 的 自动化测试框架 。selenium相对于Playwright慢很多&#xff0c;因为Playwright是异步实现的&#xff0c;但是selenium是同步的&#xff0c;就是后一个操作必须等待前一个操作。 sel…