力扣HOT100之二叉树:98. 验证二叉搜索树

这道题之前也刷过,自己做了一遍,发现卡在了第70多个样例,才发现自己没有利用二叉搜索树的性质,但凡涉及到二叉搜索树,应该首先考虑中序遍历!!!

被卡住的测试样例是这样的:

虽然每个左子树和右子树都是二叉搜索树,但是没有满足右子树中所有元素都大于根节点元素这一性质,所以还需要进一步考虑:如何才能保证左子树的所有元素都小于当前根节点,右子树的所有元素都大于根节点?

我们需要引入一个额外的全局变量,用一个指针pre指向当前根节点的上一个遍历节点(也就是其左子树的最右下角的节点),将中序遍历的结果放到一维数组中,该指针指向的实际上就是当前节点元素的前一个元素。我们需要判断root的值和pre的值谁更大,如果pre -> val >= root -> val,就说明排列出现了问题,不满足二叉搜索树的性质,直接返回false,否则将当前节点root赋值给pre

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* pre = nullptr;
    bool isValidBST(TreeNode* root) {
        //涉及二叉搜索树要用中序遍历!!!
        if(!root) return true;  //递归终止条件
        //单层递归逻辑
        //左
        bool left_flag = isValidBST(root -> left);  
        //中
        if(pre && pre -> val >= root -> val)
            return false;
        pre = root;
        //右
        bool right_flag = isValidBST(root -> right);
        return left_flag && right_flag;
    }
};
相关推荐
格林威3 小时前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
007php0073 小时前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
程序员莫小特5 小时前
老题新解|大整数加法
数据结构·c++·算法
过往入尘土6 小时前
服务端与客户端的简单链接
人工智能·python·算法·pycharm·大模型
zycoder.6 小时前
力扣面试经典150题day1第一题(lc88),第二题(lc27)
算法·leetcode·面试
Dream it possible!6 小时前
LeetCode 面试经典 150_哈希表_存在重复元素 II(46_219_C++_简单)
leetcode·面试·散列表
蒙奇D索大6 小时前
【数据结构】考研数据结构核心考点:二叉排序树(BST)全方位详解与代码实现
数据结构·笔记·学习·考研·算法·改行学it
智驱力人工智能7 小时前
工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
人工智能·算法·安全·边缘计算·抽烟检测算法·工厂抽烟检测系统·吸烟监测
学学学无无止境7 小时前
组合两个表-力扣
leetcode
程序员爱钓鱼7 小时前
Go语言实战案例——进阶与部署篇:编写Makefile自动构建Go项目
后端·算法·go