力扣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;
    }
};
相关推荐
焦耳加热2 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn2 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6063 小时前
常用排序算法核心知识点梳理
算法·排序
蒋星熠5 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油5 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream5 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL6 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
空白到白6 小时前
机器学习-聚类
人工智能·算法·机器学习·聚类
索迪迈科技6 小时前
java后端工程师进修ing(研一版 || day40)
java·开发语言·学习·算法
zzzsde7 小时前
【数据结构】队列
数据结构·算法