【递归搜索回溯专栏】专题二:二叉树中的深搜----验证二叉搜索树

简介: 【递归搜索回溯专栏】专题二:二叉树中的深搜----验证二叉搜索树


题目来源

本题来源为:

Leetcode 98. 验证二叉搜索树

题目描述

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

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

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

算法原理

二叉搜索树大家都不陌生,这里还是在强调一下:

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

本题我将采取两种策略来解决此问题,并且我们借助全局变量来解决,发现全局变量的优势:

策略一:

根据二叉搜索树的定义,借助全局变量实现。

我们通过动图来模拟一下这个过程:

起先将全局变量初始化为无穷小,因为二叉搜索数的最小节点一定是比无穷小大的。

根据二叉搜索树中序遍历的结果是一个有序的序列的性质,我们采取中序的方式来更新我们的全局变量,所以每一次更新后的全局变量的值一定是要比之前的值大的,要是更新过程中比前面的值小,那么他就不符合二叉搜索树的性质,自然就不是一颗二叉搜索树。

策略一代码实现:

注意节点的取值范围最小为-231,因此定义变量初始化为long.

class Solution 
{
    long prev=LONG_MIN;
public:
    bool isValidBST(TreeNode* root) 
    {
        //空树直接返回true
        if(root==nullptr)
            return true;
         //左子树是不是符合
        bool left=isValidBST(root->left);
        //判断当前层是否符合二叉搜素树
        bool cur=false;
        if(root->val>prev)
            cur=true;
        //全局变量修改成当前位置的值
        prev=root->val;
        //右
        bool right=isValidBST(root->right);
        return left&&right&&cur;
    }
};

策略二:

策略二是在策略一的基础上添加了剪枝。

使用剪枝可以加快我们的搜索过程,提高效率。

剪枝的过程很简单:

在我们dfs发现19节点已经不符合二叉搜索树的性质时,那么此时就不应在遍历30节点的右子树了,那么这一段我们就可以直接剪掉。

策略二代码实现

class Solution 
{
    long prev=LONG_MIN;
public:
    bool isValidBST(TreeNode* root) 
    {
        //空树直接返回true
        if(root==nullptr)
            return true;
        //左子树是不是符合
        bool left=isValidBST(root->left);
        //左子树弄完发现不是二叉搜索树
        //剪枝
        if(left==false)
            return false;
        //判断当前层是不是二叉搜索树
        bool cur=false;
        if(root->val>prev)
            cur=true;
        //剪枝
        if(cur==false)
        return false;
        //全局变量修改成当前位置的值
        prev=root->val;
        //右
        bool right=isValidBST(root->right);
        return left&&right&&cur;
    }
};
相关文章
|
前端开发 小程序
919. 【前端】Taro.useShareAppMessage 自定义分享封面
919. 【前端】Taro.useShareAppMessage 自定义分享封面
1005 2
|
算法 Python
Python高级算法——回溯法(Backtracking)
Python高级算法——回溯法(Backtracking)
986 2
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
812 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
11月前
|
人工智能
🎨 设计师必备!AI Stable Diffusion 提示词神器,让你秒变创意大师!
AI绘图新时代来临,设计师必备工具——**白盒子AI绘图提示词生成器**助你轻松跨越提示词难题。该工具操作简便,支持中英文切换,涵盖近1000个精选提示词,适用于各种风格创作。无论是新手还是专业设计师,都能大幅提升工作效率,快速实现创意构想。网址:[https://www.baihezi.com/ai-painting-prompt](https://www.baihezi.com/ai-painting-prompt)
709 19
🎨  设计师必备!AI Stable Diffusion 提示词神器,让你秒变创意大师!
|
8月前
|
人工智能 自然语言处理 测试技术
谷歌AI 多模态 Gemini 2.5 Pro的国内使用教程
在人工智能(AI)的星辰大海中,谷歌再次投下一枚重磅炸弹 💣!他们倾注心血打造的智慧结晶
3512 0
|
12月前
|
人工智能 数据库
打破常规:引领增长的五大变革行为
打破常规:引领增长的五大变革行为
|
安全 开发者 UED
APP上架到应用商店需要哪些流程?
APP上架是一个涉及多个步骤和准备工作的过程,主要包括准备上架资料和遵循上架流程两个方面。
1241 1
|
缓存 边缘计算 负载均衡
如何理解CDN?说说实现原理?
CDN(内容分发网络)是提升网络访问速度的关键技术,通过在全球或全国范围内设立边缘服务器,将内容缓存到靠近用户的地方。当用户访问网站时,DNS返回CNAME,引导用户连接到最近的CDN节点,而非直接到源站。CDN的负载均衡系统依据用户位置、运营商、节点负载等因素选择最佳边缘节点提供服务,而缓存系统则存储常用资源以提高命中率,减少回源请求。高命中率使得CDN能显著提高网站性能,降低网络拥塞。
4351 0
如何用cpolar创建隧道,实现外网访问内网?
如何用cpolar创建隧道,实现外网访问内网?
382 0
|
存储
【51单片机】用定时器扫描矩阵键盘
【51单片机】用定时器扫描矩阵键盘
568 0

热门文章

最新文章