二叉树力扣刷题(3)98. 验证二叉搜索树

109 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

本文已参与[新人创作礼]活动,一起开启掘金创作之路

题目

98. 验证二叉搜索树

难度中等1598

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

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

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

 

示例 1:

输入: root = [2,1,3]
输出: true

示例 2:

输入: root = [5,1,4,null,null,3,6]
输出: false
解释: 根节点的值是 5 ,但是右子节点的值是 4

 

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

思路一

1.中序遍历

2.构建一个数组其值按从小到大来

代码

class Solution {
public:
    vector<int> ret;
    void reversal(TreeNode*root) {
        if (root->left) reversal(root->left);  //左
        ret.push_back(root->val);              //中
        if (root->right) reversal(root->right);//右
    }
    bool isValidBST(TreeNode* root) {
        reversal(root);
        for (int i = 1; i < ret.size(); i++) {
            if (ret[i - 1] >= ret[i] ) return false; 
        }return true;
    }

};

思路二

中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 二叉搜索树,继续遍历;否则直接返回 false。

代码

class Solution {
public:
    long long pre = (long long)INT_MIN - 1;    //注意此处
    bool isValidBST(TreeNode* root) {
        if (root == nullptr) return true;
        if (!isValidBST(root->left)) return false;//左
        if (pre >= root->val) return false;       //不符合条件返回false
        pre = root->val;
        if (!isValidBST(root->right)) return false;//右
        return true;
    }
};

注意代码中使用的是long long pre = (long long)INT_MIN - 1,而不是 long long pre = INT_MIN - 1.

原因: 这样的书写是错误的,只是保证了pre是longlong范围, 但是INT_MIN - 1已经超出了int的范围,所以前面需要加(long long)。

-2147483648到2147483647

(INT_MIN ~INT_MAX)

(-INT_MAX - 1~ INT_MAX)