力扣刷题-二叉树-二叉搜索树中的搜索

700 二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,
image.png
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回None。

思路

二叉搜索树是一个有序树:

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

这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。
本题,其实就是在二叉搜索树中搜索一个节点。那么我们来看看应该如何遍历。

递归

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

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

  1. 确定终止条件

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

  1. 确定单层递归的逻辑

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

# 学习二叉搜索树的特性
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right# 1. 递归法 
class Solution(object):def searchBST(self, root, val): # 1. 确定递归函数参数是传入根节点还要给定值 返回值为节点类型""":type root: TreeNode:type val: int:rtype: TreeNode"""# 2. 确定终止条件 树为空 或 找到这个值 都返回 root 注意 root是递归迭代的 用root代表树if not root or root.val == val:return root# 3. 单层逻辑 root.val > val  与 root.val < val 进行比较if root.val > val:result = self.searchBST(root.left, val) # 需要用一个变量来接收返回值if root.val < val:result = self.searchBST(root.right, val)return result

迭代法

一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。
对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。
对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。
而对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。
例如要搜索元素为3的节点,我们不需要搜索其他节点,也不需要做回溯,查找的路径已经规划好了。
中间节点如果大于3就向左走,如果小于3就向右走,如图
image.png

        
# 2. 迭代法 注意二叉搜索树的特性
class Solution(object):def searchBST(self, root, val):while root: # 循环(遍历)if root.val > val:root = root.leftelif root.val < val:root = root.rightelse:return rootreturn None

总结

本篇介绍了二叉搜索树的遍历方式,因为二叉搜索树的有序性,遍历的时候要比普通二叉树简单很多。
但是很容易忽略二叉搜索树的特性,所以写出遍历的代码就未必真的简单了。
所以针对二叉搜索树的题目,一样要利用其特性。

参考:
https://www.programmercarl.com/0700.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%90%9C%E7%B4%A2.html#%E6%80%9D%E8%B7%AF

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

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

相关文章

UDP单播

CMakeLists.txt文件中添加如下行&#xff1a; link_libraries(ws2_32) 1.发送端 #include <iostream> #include <winsock2.h> #include <cstdio>#pragma comment(lib, "Ws2_32.lib") // Link with ws2_32.libint main() {1.Initialize winsock…

JS 手写 new 函数

工作中我们经常会用到 new 关键字&#xff0c;new 一个构造函数生成一个实例对象&#xff0c;那么new的过程中发生了什么呢&#xff0c;我们今天梳理下 创建一个对象对象原型继承绑定函数this返回对象 先创建一个构造函数&#xff0c;原型上添加一个方法 let Foo function (n…

MySQL中NULL值与空值的坑

1. 表达含义 在mysql中 空值&#xff1a;表示一个空字符或零长度的字符串&#xff0c;可以使用空引号 来表示&#xff0c;是已被定义的值&#xff1b; NULL值&#xff1a;NULL表示缺少一个已知或适当的值&#xff0c;是未被定义的值&#xff1b;。 2. 比较运算 空值&…

03、Kafka ------ CMAK(Kafka 图形界面管理工具) 下载、安装、启动

目录 CMAK&#xff08;Kafka 图形界面管理工具&#xff09;下载安装启动打开 cmak 图形界面 CMAK&#xff08;Kafka 图形界面管理工具&#xff09; Kafka本身并没有提供Web管理工具&#xff0c;而是推荐使用bin目录下各种工具命令来管理Kafka&#xff0c; 这些工具命令其实用起…

vue3中标签form插件

想写一个系统&#xff0c;对八字进行标注&#xff0c;比如格局&#xff0c;有些八字就有很多格局&#xff0c;于是就想着使用el-tag但是&#xff0c;form表单中如何处理呢&#xff1f; 这个时候&#xff0c;就需要自己写一个,modelValue是表单的默认属性 <template><…

C++重温笔记(八): C++异常

1. 写在前面 c在线编译工具&#xff0c;可快速进行实验: https://www.bejson.com/runcode/cpp920/ 这段时间打算重新把c捡起来&#xff0c; 实习给我的一个体会就是算法工程师是去解决实际问题的&#xff0c;所以呢&#xff0c;不能被算法或者工程局限住&#xff0c;应时刻提…

复试 || 就业day09(2024.01.04)算法篇

文章目录 前言验证外星语词典在长度 2N 的数组中找出重复 N 次的元素找到小镇的法官查找共用字符数组的相对排序分发饼干分发糖果区间选点(AcWing)最大不相交区间数量(AcWing)无重叠区间关于重写小于号 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考…

国内SAP代理公司排行榜,哲讯为您选择最佳合作伙伴

SAP系统在企业数字化转型中的重要性日益凸显&#xff0c;越来越多的企业意识到了SAP的价值和潜力。然而&#xff0c;在选择合适的SAP代理公司方面&#xff0c;许多企业常常感到困惑。因此&#xff0c;本文将为您介绍国内SAP代理公司排行榜&#xff0c;为您提供参考和指导&#…

以 Serverfull 方式运行无服务器服务

当前 IT 架构中最流行的用例是从 Serverfull 转向 Serverless 设计。在某些情况下&#xff0c;我们可能需要以 Serverfull 方式设计服务或迁移到 Serverfull 作为运营成本的一部分。 在本文中&#xff0c;我们将展示如何将 Kumologica flow 作为 Docker 容器运行。通常&#x…

相机FOV是什么英文单词的缩写,是什么意思。

问题描述&#xff1a;相机FOV是什么英文单词的缩写&#xff0c;是什么意思。 问题解答&#xff1a; FOV 是 "Field of View" 的缩写&#xff0c;翻译成中文是视场角或视野。在相机领域&#xff0c;相机的 FOV 表示相机能够捕捉到的场景范围的大小&#xff0c;通常用…

HarmonyOS页面和自定义组件生命周期

页面和自定义组件生命周期 在开始之前&#xff0c;我们先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff…

通信管理之设备管理

点击标题栏 【系统】--【通信管理】 串口通信指串口按位&#xff08;bit)发送和接受字节。尽管比特字节的串行通信慢&#xff0c;但是串口可以在使用一根线发送数据的同时用另一根线接受数据&#xff0c;串口通信协议是指规定了数据包的内容&#xff0c;内容包含了起始位、主体…

52、全连接 - 特征与样本空间的对应关系

上一节说到经过全连接层之后,神经网络学习到的特征,会从隐层特征空间逐步映射到样本空间,这主要是由于全连接层可以融合全局的特征。 在经过全连接层之后,在 ResNet50 这个神经网络中会输出1000个特征的得分值,这1000个特征的得分值,便可以对应到图像的分类。 怎么对应…

居然在Web上就可以体验下苹果电脑的操作系统啦?

发现一款宝藏项目 MacOS &#xff0c;在Web上打造一款原汁原味的 MacOS系统&#xff0c;不同于以外的仿操作系统的web应用&#xff0c;该应用底层基于 HTML5的 FileSystem 和 IndexedDB 构建了文件系统&#xff0c;理论上可以基于这套系统实现任何的上层应用。作者还制定了可以…

洛谷P1024[NOIP2001 提高组] 一元三次方程求解(cpp)(二分查找)

目录 1.题目 2.思路 3.AC 1.题目 # [NOIP2001 提高组] 一元三次方程求解 ## 题目描述 有形如&#xff1a; 这样的一个一元三次方程。给出该方程中各项的系数&#xff08;a,b,c,d 均为实数&#xff09;&#xff0c;并约定该方程存在三个不同实根&#xff08;根的范围在 -…

【JavaEE进阶】 关于Spring mvc 响应

文章目录 &#x1f38d;序言&#x1f333; 返回静态⻚⾯&#x1f332;RestController 与 Controller 的关联和区别&#x1f334;返回数据 ResponseBody&#x1f38b;返回HTML代码⽚段&#x1f343;返回JSON&#x1f340;设置状态码&#x1f384;设置Header&#x1f6a9;设置Con…

Python循环语句

for 循环 for循环主要用来实现固定次数的循环&#xff0c;用于将一段代码重复的执行固定次数。 比如&#xff1a;循环打印数字&#xff0c;打印1-100之间的每个整数 for i in range(100):print(i1)while 循环 while循环用于实现不知道要执行多少次的循环&#xff0c;一般需…

【hyperledger-fabric】部署和安装

简介 对hyperledger-fabric进行安装&#xff0c;话不多说&#xff0c;直接开干。但是需要申明一点&#xff0c;也就是本文章全程是开着加速器进行的资源操作&#xff0c;所以对于没有开加速器的情况可能会由于网络原因导致下载资源失败。 资料提供 1.官方部署文档在此&#…

PyTorch|transforms

在将图片输入到神经网络进行训练时&#xff0c;一般都需要对输入的图像进行预处理。对图片进行操作有很多种方法&#xff0c;这里我们使用torchvision库的transforms模块。 tansforms有很多种方法(一些可以用在张量和PIL图像&#xff0c;一些仅能用于张量&#xff0c;而另一些…

解密!电梯机房温差之谜

小伍&#xff1a;大家好&#xff0c;本次小伍带大家来到【电梯机房】&#xff0c;我们来先测一下温度 电梯机房【外屋】&#xff1a;23.2 度 小伍&#xff1a;好&#xff0c;我们再看里面的设备温度 电梯机房【外里】&#xff1a;74 度 523能源&#xff1a;哇塞&#xff0c;…