98. 验证二叉搜索树(LeetCode)

文章目录


前言

在本文章中,我们将要详细介绍一下Leetcode中第98题验证二叉搜索树,

在本内容中我们将会学到递归解决二叉树,全局变量,剪枝等等相关内容。

一、题目分析

分析:

🏉🏉验证一棵树是二叉搜索

🏉🏉左子树只包含小于当前节点的数。这并不仅仅针对根节点,左子树的那一个值。而是整个左子树的值,右子树也一样。

对于5这个根节点来说,左子树结果为4,右子树结果为8,满足二叉搜索树的条件。

对于4这个根节点来说,左子树结果为1,右子树结果为7,满足二叉搜索树的条件。

但这并不是一颗二叉搜索树

二叉搜索树要求整个左子树的所有值都小于根节点,右子树的所有值都大于根节点。

我们再来看一下这个例子,对于根为4的这个二叉树右子树结果7大于这颗二叉树的根节点5,所以不满足条件,这就不是一颗二叉搜索树。

二、算法原理

搜索二叉树:中序遍历的结果是一个有序序列

我们解决这道题可以通过这个性质解决。创建一个全局变量初始化为负无穷,记录中序遍历的前驱节点,通过与前驱节点进行判断是否满足二叉搜索树。

🌟🌟设置递归出口,到达空树结束,空树也是一颗二叉搜索树

🌟🌟中序遍历,首先判断左子树情况。

🌟🌟再判断这个节点是否满足二叉搜索树的性质,进行比较。同时更新这个全局变量。

🌟🌟最后判断右子树是否满足二叉搜索树。

🌟🌟只有三种情况都满足才是一颗二叉搜索树

我们来看一下细节:

我们初始化全局变量为int最小值,万一二叉树中的值也是int最小值,就会对结果产生干扰。我们希望这个全部遍历不影响运行判断,所以我们需要一个更小的值进行初始化。
LONG_MIN

三、代码实现+剪枝

cpp 复制代码
class Solution {
public:
     //初始化
    long prev=LONG_MIN;
    bool isValidBST(TreeNode* root) 
    {
        //递归出口,空树也是二叉搜索树
        if(root==nullptr)
        {
            return true;
        }

        //判断左子树
        bool left=isValidBST(root->left);
        //判断性质
        bool ret=false;
        if(root->val>prev)
        {
            ret=true;
        }
        //更新全局变量
        prev=root->val;

        //判断右子树
        bool right=isValidBST(root->right);
        
        //只有左子树,右子树,根节点都满足才是一颗二叉搜索树
        return ret&&&left&&right;

    }
};

我们可以通过剪枝提高运行效率

💗💗我们发现,首先判断左子树是否为一颗二叉搜索树,再判断当前节点,最后判断右子树情况。

💗💗如果我们发现左子树不是一颗二叉搜索树,我们直接返回false,就不用再判断当前节点何右子树了,提高效率。

💗💗同理,左子树是一颗二叉搜索树,如果当前节点不满足性质,也返回false,就不用再判断右子树情况了,提高运行效率。

cpp 复制代码
class Solution {
public:
    long prev=LONG_MIN;
    bool isValidBST(TreeNode* root) 
    {
        //递归出口,空树也是二叉搜索树
        if(root==nullptr)
        {
            return true;
        }

        //判断左子树
        bool left=isValidBST(root->left);
        //剪枝
        if(left==false)
        {
            return false;
        }

        //判断性质
        bool ret=false;
        if(root->val>prev)
        {
            ret=true;
        }
        //剪枝
        if(ret==false)
        {
            return false;
        }
        //更新全局变量
        prev=root->val;

        //判断右子树
        bool right=isValidBST(root->right);
        
        //只有左子树,右子树,根节点都满足才是一颗二叉搜索树
        return ret&&&left&&right;

    }
};

总结

以上就是我们对Leetcode中验证二叉搜索树详细介绍,希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~😘😘😘

相关推荐
@蓝莓果粒茶2 分钟前
LeetCode第132题_分割回文串II
开发语言·算法·leetcode·职场和发展·c#·.net·linq
程序媛学姐22 分钟前
SpringRabbitMQ消息发送:RabbitTemplate与消息确认
java·开发语言·spring
mxd0184825 分钟前
sojson。v5:新一代JavaScript代码保护工具的技术解析与应用场景
开发语言·javascript·ecmascript
汐汐咯33 分钟前
编程题学习
c++
云闲不收40 分钟前
垃圾回收——三色标记法(golang使用)
jvm·算法·golang
孞㐑¥1 小时前
C++之红黑树
开发语言·c++·经验分享·笔记
菜鸟江多多1 小时前
32x32热成像高斯滤波图像处理
图像处理·单片机·算法
阳洞洞1 小时前
二叉树的层序遍历
数据结构·算法·leetcode·二叉树遍历·广度优先搜索
今天也要早睡早起1 小时前
代码随想录算法训练营Day32| 完全背包问题(二维数组 & 滚动数组)、LeetCode 518 零钱兑换 II、377 组合总数 IV、爬楼梯(进阶)
数据结构·c++·算法·leetcode·动态规划·完全背包
字节旅行者1 小时前
C++中如何使用STL中的list定义一个双向链表,并且实现增、删、改、查操作
开发语言·数据结构·c++·链表