【LeetCode热题100】98. 验证二叉搜索树(二叉树)递归阶段总结1

一.题目要求

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

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

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

二.题目难度

中等

三.输入样例

示例 1:
在这里插入图片描述
输入:root = [2,1,3]
输出:true

示例 2:
在这里插入图片描述
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

四.解题思路

前中后序列递归都能解,后序的不太好想

五.代码实现

中序

class Solution {
public:
    bool isValidBST(TreeNode* root) {

        if(!root) return false;

        midFind(root);
        for(vector<int>::iterator it = ans.begin(); it != ans.end() - 1; it++)
        {
            if(*it >= *(it + 1)) return false;
        }
        return true;
    }

    TreeNode* midFind(TreeNode * root)
    {
        if(root == nullptr) return nullptr;
        midFind(root->left);
        ans.push_back(root->val);
        midFind(root->right);
        return root;
    }

private:
    vector<int> ans;
};

中序优化后

class Solution {
public:
    bool isValidBST(TreeNode* root) {

        //首先明确是中序遍历判断二叉搜索树
        //中序遍历判断的核心是结点值升序排列
        //基于这种情况微操作需要判断当前结点值是否大于前一个结点就行了
        //不需要去考虑后面的问题

        //基础情况处理
        if(root == nullptr) return true;

        //超级调用 判断左子树
        if(!isValidBST(root->left))
            return false;

        //微操作 专注处理当前节点
        if(pre >= root->val) return false;
        else pre = root->val;

        //超级调用 判断右子树
        if(!isValidBST(root->right))
            return false;
        
        return true;
    }
private:
    long pre = LONG_MIN;

};

前序

class Solution {
public:
    bool isValidBST(TreeNode* root) {

        //首先明确是前序遍历判断二叉搜索树
        //前序遍历判断的核心是结点值比左子树允许范围最大值大,比右子树允许范围最小值小
        //基于这种情况微操作需要判断当前结点值和左右结点
        return validate(root, LONG_MIN, LONG_MAX);  
    }
    bool validate(TreeNode* node ,long min ,long max)
    {
        //基础情况处理
        if(node == nullptr) return true;
       //微操作 专注处理当前节点
        if(min >= node->val || max <= node->val) return false;
        //超级操作 判断左子树
        if(!validate(node->left, min, node->val)) return false;
        //超级操作 判断右子树
        if(!validate(node->right, node->val, max)) return false;
        return true;
    }
};

后序
GPT解法

class Solution {
public:
    struct ResultType {
        bool isBST;
        long long minVal, maxVal;
        ResultType(bool isBST, long long minVal, long long maxVal) : isBST(isBST), minVal(minVal), maxVal(maxVal) {}
    };

    bool isValidBST(TreeNode* root) {
        ResultType result = validateBST(root);
        return result.isBST;
    }

private:
    ResultType validateBST(TreeNode* node) {
        // 空节点视为合法BST
        if (!node) return ResultType(true, LONG_MAX, LONG_MIN);

        // 分别验证左右子树
        ResultType left = validateBST(node->left);
        ResultType right = validateBST(node->right);

        // 如果左右子树都是BST,且当前节点大于左子树最大值,小于右子树最小值,则当前子树是BST
        if (left.isBST && right.isBST && node->val > left.maxVal && node->val < right.minVal) {
            return ResultType(true, 
                              min((long long)node->val, left.minVal), // 更新当前子树的最小值
                              max((long long)node->val, right.maxVal)); // 更新当前子树的最大值
        } else {
            return ResultType(false, 0, 0);
        }
    }
};

六.题目总结

递归问题分解

1. 递归函数定义
明确函数的使命:这是设计递归函数的第一步,你需要清楚地知道这个函数要做什么,它的输入和输出是什么。
明确原问题与子问题:在递归的上下文中,需要识别如何将原始问题分解为更小的、可通过相同处理方式解决的子问题。
兼顾原问题与子问题:在设计递归时,要保证处理子问题的方式同样适用于原问题,这保证了递归的一致性和可行性。
2. 基础情况处理
数据规模较小时直接返回答案:这是递归的终止条件,也称为基案(base case)。没有这个条件,递归将无限循环下去。通常是当问题规模缩小到一个非常简单的程度时,可以直接给出答案。
3. 递归调用
超级操作:这一步涉及对子问题进行递归调用。
看成整体,忽略细节:这意味着当你调用递归函数时,不需要关心它是如何实现的。你只需“相信”递归调用能正确解决子问题。
相信递归调用:这是递归中的“信任步骤”。你要相信每次递归调用都能正确地向基案逼近,并最终得到正确答案。
4. 递推到当前层
计微操作:在完成了对子问题的递归调用后,你可能需要根据子问题的结果来计算当前问题的结果。这通常涉及到一些额外的处理,以将子问题的解逐步“递推”回原问题的解。

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if(root == nullptr) return true;
        
        if(!isValidBST(root->left) || root->val <= pre)
            return false;
        pre = root->val;
        
        return isValidBST(root->right);
    } 

根据提出的四个部分来分析这段代码:

  1. 递归函数定义
    明确函数的使命:判断以root为根的树是否是一个有效的二叉搜索树。
    明确原问题与子问题:原问题是判断整棵树是否是二叉搜索树,子问题是判断左子树和右子树是否是二叉搜索树。
    兼顾原问题与子问题:如果一个节点的左子树和右子树都是二叉搜索树,并且该节点的值大于左子树中所有节点的值且小于右子树中所有节点的值,那么以该节点为根的树也是二叉搜索树。
  2. 基础情况处理
    数据规模较小时直接返回答案:当root为空时,按照二叉搜索树的定义,空树也是一个有效的二叉搜索树,因此直接返回true。
  3. 递归调用
    超级操作:代码通过递归调用isValidBST(root->left)和isValidBST(root->right)来分别检查左右子树。
    看成整体,忽略细节:在检查左子树和右子树时,我们不需要关心它们是如何实现的,只需要相信isValidBST函数能够正确判断子树是否为二叉搜索树。
  4. 递推到当前层
    计微操作:在中序遍历的过程中,pre变量用于记录前一个访问的节点的值。对于当前的节点,如果它的值小于等于pre的值,则不满足二叉搜索树的定义,应该返回false。如果当前节点的左子树是二叉搜索树,并且当前节点的值大于pre的值,那么更新pre为当前节点的值,并继续检查右子树。
    这段代码中缺少了pre变量的初始化和声明,通常pre应该是一个长整型变量,并且在使用中序遍历之前被初始化为一个最小值(或者使用long long的最小值,或者设置为nullptr并在逻辑中适当处理)。这样可以确保第一个节点的值大于pre。此外,pre需要被定义在递归函数外部或作为参数传递,以保持其在递归调用中的连续性。

递归解题核心其实是明确微操作要干什么,即从n推到n+1的过程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Keycloak介绍

1.什么是Keycloak Keycloak是一个开源的身份和访问管理解决方案&#xff0c;它提供了单点登录&#xff08;SSO&#xff09;功能。 Keycloak 支持多种标准协议&#xff0c;包括 OpenID Connect 和 OAuth 2.0&#xff0c;这使得它能够与各种服务进行集成&#xff0c;以提供身份…

几个常用的AI工具

人工智能大模型的出现对人类社会产生了深远的影响&#xff0c;这些影响既包括积极的方面&#xff0c;也包括一些潜在的挑战: 1. **提高效率**&#xff1a;AI大模型能够快速处理大量数据&#xff0c;提高工作效率&#xff0c;尤其在数据分析、自然语言处理等领域。 2. **辅助决…

Spring - AOP/事务 实现原理

AOP 基本概念 官方文档&#xff1a; Aspect Oriented Programming with Spring Spring AOP supports the following AspectJ pointcut designators (PCD) for use in pointcut expressions: within - limits matching to join points within certain types (simply the exec…

怎么建设数据中台?详解数据中台架构内的三大平台

一、什么是数据中台&#xff1f; 要知道“中台”是什么&#xff0c;就得先了解“前台”和“后台”。 前台&#xff0c;就是我们日常使用的过程中可以直接看到和感知到的东西&#xff0c;比如你打开某东app买了个3080显卡&#xff0c;在这个过程中你看到的页面以及搜索、点击详…

考研数学|武忠祥高数全年学习包分享

u1s1&#xff0c;武忠祥老师的课程真的不错&#xff0c;宝藏级老师 其实我觉得没必要对比每一个考研数学老师&#xff0c;汤家凤还有张宇以及武忠祥都是非常受欢迎的老师&#xff0c;也都很有实力&#xff0c;只不过讲课的风格有所区别。 比如汤家凤老师就像是高中那种不苟言…

洁净环境监测相关法规指南汇总

一 洁净级别确认 1. 用于生产无菌药品的洁净室和洁净空气设备如单向流系统&#xff08;UDAF&#xff09;、限制进入屏障系统&#xff08;RABS&#xff09;和隔离器&#xff0c;应根据所需环境特性进行确认。生产操作需要在适当洁净度级别的环境中进行&#xff0c;以降低粒子或…

M1 mac安装 Parallels Desktop 18 激活

M1 mac安装 Parallels Desktop 18 激活 下载安装Parallels Desktop 18.1.1 (53328) 激活1. 拷贝prl_disp_service2. 在终端打开Crack所在位置3. 输入命令&#xff0c;激活成功 下载 安装包和激活文件下载地址 链接: https://pan.baidu.com/s/1EjT7xeEDcntIIoOvvhBDfg?pwd9pue …

智能无人集群系统跨域协同技术研究现状与展望

源自&#xff1a;中国工程院院刊 作者&#xff1a;江碧涛&#xff0c;温广辉&#xff0c;周佳玲&#xff0c;郑德智 “人工智能技术与咨询” 发布 编者按 随着智能化技术和无人系统技术的快速发展&#xff0c;智能无人集群系统跨域协同的概念应运而生并得到了广泛关注与深…

element-ui radio-group 组件源码分享

接着上篇的 radio 组件源码分享&#xff0c;继续探索 radio-group 源码部分的实现过程&#xff0c;主要从以下四个方面来讲解&#xff1a; 1、el-radio-group 页面结构 2、el-radio-group 组件属性 3、el-radio-group 组件方法 4、核心代码部分 一、页面结构&#xff0c;如…

成都伊理威:抖音开网店如何找好货源

在数字浪潮的推动下&#xff0c;抖音已成为创业者开展电子商务的热土。开设一家抖音网店&#xff0c;如何找寻优质的货源成为成功的关键一环。选择货源&#xff0c;犹如为网店插上腾飞的翅膀&#xff0c;既要注重品质&#xff0c;也要考虑成本&#xff0c;确保产品能够在激烈的…

jspssm_maven项目——KTV点歌系统

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网的广泛渗透和进步&#xff0c;基于网络技术的KTV点歌系统迅速壮大&#xff0c;其发展始终围绕用户的实际需求展开。通过深入洞察用户的需求&#xff0c;开发出高度定制的管理平台&#xff0c;利用网络的便捷性对系统…

【晴问算法】入门篇—字符串处理—首字母大写

题目描述 给定一堆用空格隔开的英文单词&#xff0c;将每个单词的首字母改为大写后输出。输入描述 一堆英文单词&#xff0c;每个单词不超过10个字符&#xff0c;且仅由小写字母组成;每两个单词之间用一个空格隔开&#xff0c;整个字符串的长度不超过1000。输出描述 输出每个单…

基于React的低代码平台开发实践

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;在线地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

浏览器输入框自动填充默认样式移除

文章目录 浏览器输入框自动填充默认样式移除问题现象以及探索过程尝试代码有效关键代码&#xff08;解决方案&#xff09; 浏览器输入框自动填充默认样式移除 问题现象以及探索过程 &#xff08;在 uniapp 语法下&#xff09;本文的写法在 Edge 119.0.2151.58 (正式版本) (64 …

爱校对:网站内容的温暖守护者

在这个快速变化的信息时代&#xff0c;网站如同一个生动的生态系统&#xff0c;每时每刻都在更新和进化。但是&#xff0c;随之而来的是一个挑战&#xff1a;如何确保这个生态系统中的每一条信息都是准确、合法、并且对用户友好呢&#xff1f;这就是我们&#xff0c;爱校对网站…

​企业是否需要向个人信息主体提供《标准合同》副本文件?​

企业是否需要向个人信息主体提供《标准合同》副本文件&#xff1f; 目前未见有规定强制要求企业需要主动向个人信息主体提供《标准合同》的副本文件&#xff0c;但个人信息主体具有要求个人信息处理者提供其所签订的《标准合同》副本的权利&#xff0c;企业必须配合。在提供副…

Jetson AGX ORIN 配置 FGVC-PIM 神经网络(包含 arm64 下面 torch 和 torchvision 配置内容)

Jetson AGX ORIN 配置 FGVC-PIM 神经网络 文章目录 Jetson AGX ORIN 配置 FGVC-PIM 神经网络配置 ORIN 环境创建 FGVC-PIM 虚拟环境安装 PyTorch安装 torchvision安装其他依赖包 配置 ORIN 环境 首先先配置 ORIN 的环境&#xff0c;可以参考这个链接&#xff1a; Jetson AGX …

【考研数学】张宇全程学习包

可以全程张宇老师的高等数学&#xff0c;张宇老师的拿手绝活是高数 但是其他科目&#xff0c;还有更好的选择&#xff0c;比如线性代数&#xff0c;汤家凤老师还有李永乐老师讲的都不错&#xff0c;概率论&#xff0c;余丙森老师还有方浩老师讲的很好。下面我就讲清楚&#xf…

1978-2022年全国及31省市农业机械总动力(万千瓦)(无缺失)

1978-2022年全国及31省市农业机械总动力&#xff08;万千瓦&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;1978-2022年 2、范围&#xff1a;全国及31省 3、来源&#xff1a;整理自各省年鉴 中国农业统计年鉴、国家统计局 4、指标&#xff1a;农业机械总动…

云电脑火爆出圈,如何选择和使用?--腾讯云、ToDesk云电脑、青椒云使用评测和攻略

前言&#xff1a; Hello大家好&#xff0c;我是Dream。在当下&#xff0c;科技的飞速发展已经深入影响着我们的日常生活&#xff0c;特别是随着物联网的兴起和5G网络的普及&#xff0c;云计算作为一个重要的技术概念也逐渐走进了我们的视野。云计算早已不再是一个陌生的名词&am…
最新文章