98. 验证二叉搜索树

题目要求判断给定的二叉树是否为二叉搜索树。

二叉搜索树的定义如下:

  1. 节点的左子树仅包含小于当前节点的数值;
  2. 节点的右子树仅包含大于当前节点的数值;
  3. 左子树和右子树本身也必须满足二叉搜索树的条件。

二叉树的左右子树与整棵树具有相似的结构特征,这种特性自然地将问题分解为若干子问题。在判断一棵树是否为二叉搜索树时,我们可以先分别判断其子树是否符合二叉搜索树的定义。根据二叉搜索树的性质,可以通过节点值的大小关系进行判断:首先检查左子树,然后比较当前节点值与前一节点值,最后检查右子树。这种遍历方式被称为中序遍历。

代码:

cpp 复制代码
class Solution {
public:
    long long pre = LLONG_MIN;
    bool isValidBST(TreeNode* root) {
        if (!root) return true;
        if (!isValidBST(root->left)) return false;
        if (pre >= root->val) return false;
        pre = root->val;
        return isValidBST(root->right);
    }
};

时间复杂度:O(n),每个节点都会遍历一次

空间复杂度:O(n),最坏情况下,树退化成链

换种角度看问题,是否可以先判断节点,在判断左右子树呢?可以。

该图表明,当前根节点的取值范围由其父节点或祖父节点的取值决定。例如

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​

2的取值范围为(-∞, 5],4的取值范围为[2, 5]。特别需要注意的是,整棵树的根节点5没有父节点,因此其取值范围为(-∞, +∞)。这种先访问节点值,再递归遍历左右子树的遍历方式称为前序遍历。

算法步骤如下:

  1. 判断根节点的值是否在当前取值范围内
  2. 遍历左子树,将右边界更新为当前根节点的值
  3. 遍历右子树,将左边界更新为当前根节点的值

代码:

cpp 复制代码
class Solution {
public:
    bool isValidBST(TreeNode* root,long long left = LLONG_MIN,long long right = LLONG_MAX) {
        if (!root) return true;
        long long x = root->val;
        return left < x && x < right && isValidBST(root->left,left,x) && isValidBST(root->right,x,right);
    }
};

时间复杂度,空间复杂度与中序一致

相关推荐
朝朝又沐沐4 小时前
算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
开发语言·数据结构·c++·算法·链表
薰衣草23335 小时前
一天两道力扣(6)
算法·leetcode
逝雪Yuki5 小时前
Leetcode——287. 寻找重复数
c++·leetcode·二分查找·双指针·环形链表
剪一朵云爱着5 小时前
力扣946. 验证栈序列
算法·
遇见尚硅谷5 小时前
C语言:*p++与p++有何区别
c语言·开发语言·笔记·学习·算法
天天开心(∩_∩)5 小时前
代码随想录算法训练营第三十二天
算法
YouQian7725 小时前
(AC)缓存系统
算法·缓存
艾莉丝努力练剑6 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
科大饭桶6 小时前
数据结构自学Day13 -- 快速排序--“前后指针法”
数据结构·算法·leetcode·排序算法·c
李永奉6 小时前
C语言-流程控制语句:for循环语句、while和do…while循环语句;
c语言·开发语言·c++·算法