[二叉搜索树]leetcode98:验证二叉搜索树(medium)

题目:
在这里插入图片描述
在这里插入图片描述


题解:

  • 思路1:使用区间 (l,r) 来判断以 root 为根节点的子树的所有节点值是否在这个范围内,若节点值不在这个范围内,则直接返回 false;否则我们需要继续递归左右子树看是否满足 BST 特性。进入左子树的话,上限变为 root->val;进入右子树的话,下限变为 root->val。

  • 思路2:使用中序遍历,由于 BST 的中序序列是升序数组,因此用一个变量 pre 来记录前一个节点值,若当前遍历到的节点值小于等于 pre,则直接返回 false,否则继续递归。

代码如下:

// 思路1
class Solution {
public:
    using LL = long long;
    bool isValidBST(TreeNode* root) {
       return dfs(root,LLONG_MIN,LLONG_MAX);
    }

    // 由于BST的左子树的所有节点值都小于根节点的值,右子树的所有节点值都大于根结点的值
    // 所以用区间(left,right)来判断以root为根节点的所有子树的节点值是否在整个返回内,不在就返回false
    bool dfs(TreeNode* root,LL left,LL right){
        if(!root)return true;
        if(root->val<=left||root->val>=right)return false;
        // 进入左子树的话,上限就变成根节点的值了;进入右子树的话,下限变成根节点的值了
        return dfs(root->left,left,root->val)&&dfs(root->right,root->val,right);
    }
};
// 思路2
class Solution {
public:
    // 中序遍历:判断当前节点的值是否小于前一个节点的值,若小于则满足BST特性;若大于等于,则不满足,直接返回false
    using LL = long long;
    LL pre=-1e10;
    bool isValidBST(TreeNode* root) {
        if(!root)return true;
        // 左子树不满足BST返回false,单单左子树满足BST并不能说明整颗二叉树是BST
        if(!isValidBST(root->left))return false;
        if(pre>=root->val)return false;
        // 更新前一个节点的值
        pre=root->val;
        return isValidBST(root->right);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值