力扣 hot100 Day44

98. 验证二叉搜索树

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

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

节点的左子树只包含小于当前节点的数。

节点的右子树只包含 大于 当前节点的数。

所有左子树和右子树自身必须也是二叉搜索树

cpp 复制代码
//自己写的
class Solution {
public:
    void inorderHelper(TreeNode* root, vector<int>& result) {
        if (root == nullptr) return;
        inorderHelper(root->left, result);
        result.push_back(root->val);
        inorderHelper(root->right, result);
    }
    
    bool isValidBST(TreeNode* root) {
        vector<int> res;
        inorderHelper(root, res);
        for (int i = 1; i < res.size(); i++) {
            if (res[i] <= res[i-1]) {
                return false;
            }
        }
        return true;
    }
};

最直接的想法,按中序遍历排序,如果严格升序,就符合要求,能顺利实现

cpp 复制代码
//抄的
class Solution {
public:
    bool isValidBST(TreeNode* root) {
        return helper(root, LONG_MIN, LONG_MAX);
    }
    
    bool helper(TreeNode* node, long min_val, long max_val) {
        if (!node) return true;
        
        if (node->val <= min_val || node->val >= max_val) {
            return false;
        }

        return helper(node->left, min_val, node->val) 
            && helper(node->right, node->val, max_val);
    }
};

递归做法,需要保证整个左节点树都小于根节点,右节点大于根节点,所以需要传递两个极值作为范围。