题目

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

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

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

示例 1:

img

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

示例 2:

img

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

提示:

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

解答

  • 基于限定值的递归判断

思路如下:对每一个需要被判断的节点,都为他设置一个最大值和最小值(防止子树的子树不符合搜索树条件),根节点的最大最小值是C++ longlong类型的最大最小值,之后判断左子树时,最大值变更为根节点的值,判断右子树时,最小值变为根节点的值,在判断节点时,若节点为空,则该子树是有效的二叉搜索树,否则就检查当前节点的值是否在minVal到maxVal的范围内。最后递归的验证左子树和右子树。C++实现代码如下:

/**
 * 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:
    // 辅助函数,用于验证给定的子树是否为有效的二叉搜索树
    bool isValidBSTHelper(TreeNode* node, long long minVal, long long maxVal) {
        // 如果节点为空,则表示该子树是有效的二叉搜索树
        if (node == NULL)
            return true;
        
        // 检查当前节点的值是否在[minVal, maxVal]的范围内
        if (node->val <= minVal || node->val >= maxVal)
            return false;
        
        // 递归验证左子树和右子树
        return isValidBSTHelper(node->left, minVal, node->val) &&
            isValidBSTHelper(node->right, node->val, maxVal);
    }
    bool isValidBST(TreeNode* root) {
        // 由于题目中未指定树节点的值的范围,所以我们使用长整型的最小值和最大值作为初始范围
        long long minVal = LLONG_MIN;
        long long maxVal = LLONG_MAX;
        
        // 调用辅助函数进行验证
        return isValidBSTHelper(root, minVal, maxVal);
    }
};