【递归算法实践】验证二叉搜索树

目录

1. 递归算法

2. 递归实现验证二叉搜索树

3. 递归解法的实现逻辑

4. 递归实现的实例分析


1. 递归算法

递归是一种通过函数自身调用来解决问题的算法,它可以使代码更加简洁和优雅,同时也能够解决许多复杂的问题。在递归中,函数会不断地调用自身来解决一个更小的问题,直到达到基本情况为止。

递归算法(recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。

2. 递归实现验证二叉搜索树

题目:

https://leetcode.cn/problems/validate-binary-search-tree/

https://leetcode.com/problems/validate-binary-search-tree/

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

代码实现:

from typing import Optionalclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:def __init__(self) -> None:self.pre = float("-inf")# inorder traversaldef isValidBST(self, root: Optional[TreeNode]) -> bool:if root is None :return True# 一直递进左子树中,直到遇到 None,这时候发生第一次的回归,# 然后执行下面几行代码,即进行值的判断,并且递进到右子树中,# 接着按照递进的反方向一层一层的回归if not self.isValidBST(root.left):return Falseif root.val <= self.pre:return Falseself.pre = root.valreturn self.isValidBST(root.right)if __name__ == "__main__":solution = Solution()# a = TreeNode(4)root = TreeNode(0)# c = TreeNode(3)# root.left = a# root.right = cresult = solution.isValidBST(root)print(result)

3. 递归解法的实现逻辑

`isValidBST` 方法中,先判断当前节点是否为 None,如果是则返回 True,表示当前子树是一个有效的 BST。接着,递归判断左子树是否为 BST,如果不是则返回 False。然后,判断当前节点的值是否小于等于上一个节点的值 `pre`,如果小于等于则返回 False。最后,将当前节点的值赋值给 `pre`,递归判断右子树是否为 BST,如果不是则返回 False。

如果以上条件都满足,则该二叉树是一个有效的 BST,返回 True。

在 `isValidBST` 方法中,如果左子树或右子树不是 BST,则返回 False,而不是返回 True,是因为在判断一个二叉树是否为 BST 时,只要发现它的左子树或右子树不是 BST,就可以确定该二叉树不是 BST,不需要再继续遍历下去了。

如果在左子树或右子树中发现了一个不符合 BST 的节点,那么它的父节点及其祖先节点都不可能是 BST,因为 BST 的定义要求左子树的所有节点都小于根节点,右子树的所有节点都大于根节点。因此,如果左子树或右子树不是 BST,就可以直接返回 False,不需要再继续遍历下去了,这样可以提高程序的效率。

4. 递归实现的实例分析

`isValidBST`函数是一个验证二叉搜索树的函数。下面使用一个例子来逐步解释递归的执行流程和代码实现思路。

假设我们有以下二叉树:

```
5
/ \\
1 7
/ \\
6 8
```

我们首先调用`isValidBST`函数,传入根节点`5`。由于`root`不为空,我们继续执行函数。由于`root`有左子节点`1`,我们递归调用`isValidBST`函数,传入`1`作为参数。由于`1`没有左子节点或右子节点,我们直接返回`True`。此时,我们回到了根节点`5`的函数调用。

由于`root`有左子节点,我们刚刚递归调用了`isValidBST`函数,它会返回`True`。我们继续执行函数,检查`root`的值是否大于前一个节点的值。由于这是第一个节点,前一个节点的值为负无穷,所以这个条件满足。我们将`pre`的值设置为`5`,然后继续执行函数。

由于`root`有右子节点`7`,我们递归调用`isValidBST`函数,传入`7`作为参数。由于`7`有左子节点`6`,我们继续递归调用`isValidBST`函数,传入`6`作为参数。由于`6`没有左子节点或右子节点,我们直接返回`True`。此时,我们回到了节点`7`的函数调用。

由于`7`的左子节点`6`已经处理完毕,我们继续执行函数,检查`root`的值是否大于前一个节点的值。由于`7`大于`5`,这个条件满足。我们将`pre`的值设置为`7`,然后继续执行函数。

由于`7`有右子节点`8`,我们递归调用`isValidBST`函数,传入`8`作为参数。由于`8`没有左子节点或右子节点,我们直接返回`True`。此时,我们回到了节点`7`的函数调用。

由于`root`的右子树已经处理完毕,我们回到了根节点`5`的函数调用。由于根节点`5`的左子树和右子树都已经处理完毕,且满足二叉搜索树的定义,所以整个函数返回`True`,表示这棵二叉树是一棵合法的二叉搜索树。

这段代码的实现思路是,对于每个节点,都检查它是否大于前一个节点的值。由于二叉搜索树的中序遍历是有序的,前一个节点的值应该小于当前节点的值。如果出现了前一个节点的值大于当前节点的值的情况,说明这棵二叉树不是一棵合法的二叉搜索树。

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

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

相关文章

【Redis】Spring/SpringBoot 操作 Redis Java客户端

目录 操作 Redis Java客户端SpringBoot 操作Redis 步骤 操作 Redis Java客户端 1.Jedis 2.Lettuce(主流) <-Spring Data Redis SpringBoot 操作Redis 步骤 1.添加Redis 驱动依赖 2.设置Redis 连接信息 spring.redis.database0 spring.redis.port6379 spring.redis.host…

成都优优聚拥有丰富美团代运营经验!

成都优优聚美团代运营是一家专业的电商运营服务机构&#xff0c;致力于帮助商家提升线上业绩&#xff0c;增加销售额。他们以优良的售后服务和卓越的业绩&#xff0c;赢得了众多商家的认可和信赖。 与成都优优聚美团代运营合作的好处是多方面的。首先&#xff0c;他们拥有一支经…

企业架构NOSQL数据库之MongoDB

目录 一、背景描述及其方案设计 (一)业务背景描述 &#xff08;二&#xff09;模拟运维设计方案 二、Mongodb介绍 &#xff08;一&#xff09;nosql介绍 &#xff08;二&#xff09;产品特点 1、存储性 2、 效率性 3、结构 三、安装和配置 &#xff08;一&#xff09…

Python-flask项目入门

一、flask对于简单搭建一个基于python语言-的web项目非常简单 二、项目目录 示例代码 git路径 三、代码介绍 1、安装pip依赖 通过pip插入数据驱动依赖pip install flask-sqlalchemy 和 pip install pymysql 2.配置数据源 config.py DIALECT mysql DRIVER pymysql USERN…

百度资深PMO阚洁受邀为第十二届中国PMO大会演讲嘉宾

百度在线网络技术&#xff08;北京&#xff09;有限公司资深PMO阚洁女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;运筹于股掌之间&#xff0c;决胜于千里之外 —— 360斡旋项目干系人。大会将于8月12-13日在北京举办&#xff0c;…

直播招聘小程序解决方案

项目开发愿景 介绍工作拿佣金&#xff0c;Boss直播现真身。做为直播招聘的新平台&#xff0c;让求职和招聘变得更简单&#xff01;企业发布招聘视频&#xff0c;展现公司环境与实力&#xff0c;开通会员可以直播招聘、在线面试功能&#xff1b;求职者刷视频可以刷到工作…

html实现商品图片放大镜,html图片放大镜预览

效果 实现 复制粘贴&#xff0c;修改图片路径即可使用 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>商品图片放大镜</title></head><style>body {margin: 0;padding: 0;}#app {padding: 10px;posit…

TartanVO: A Generalizable Learning-based VO 论文阅读

论文信息 题目:TartanVO: A Generalizable Learning-based VO 作者&#xff1a;Wenshan Wang&#xff0c; Yaoyu Hu 来源&#xff1a;ICRL 时间&#xff1a;2021 代码地址&#xff1a;https://github.com/castacks/tartanvo Abstract 我们提出了第一个基于学习的视觉里程计&…

携程验证码

今日话题&#xff1a;凑字数水文章。大表哥们感兴趣可以看看。 携程验证类型总共有3种。无感&#xff0c;滑块&#xff0c;点选。 process_type&#xff1a;None为无感 验证接口&#xff1a;https://ic.ctrip.com/captcha/v4/risk_inspect process_type&#xff1a;JIGSAW为…

苹果正在测试新款Mac mini:搭载M3芯片 配备24GB大内存

据悉苹果目前正在测试新的Mac机型&#xff0c;亮点是采用最新的M3芯片。 据报道&#xff0c;首款搭载M3芯片的设备应该是13英寸的MacBook Pro和重新设计的MacBook Air&#xff0c;Mac mini机型并不在名单上。 M3和M2同样拥有最多8个核心&#xff0c;分别为4个性能核和4个能效核…

ArcGIS Pro实践技术应用——暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用全流程科研能力提升

查看原文>>>ArcGIS Pro实践技术应用——暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合能力 本文将利用ArcGIS Pro 将您的 GIS 工作组织到工程中&#xff0c;您可以使用 ArcGIS Pro 映射 2D 和 3D 数据。借助 ArcGIS Pro&#xff…

14.3.4 【Linux】使用 LVM thin Volume 让 LVM 动态自动调整磁盘使用率

想像一个情况&#xff0c;你有个目录未来会使用到大约 5T 的容量&#xff0c;但是目前你的磁盘仅有 3T&#xff0c;问题是&#xff0c;接下来的两个月你的系统都还不会超过 3T 的容量&#xff0c; 不过你想要让用户知道&#xff0c;就是他最多有 5T 可以使用就是了&#xff01;…