LeetCode98. 验证二叉搜索树

57 阅读1分钟

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
    在这里插入图片描述
    这个题我用的递归进行求解的,核心思想就是,用一个区间来进行判断,左孩子一定在(MIN,父节点)内,右孩子一定在(父节点,MAX)内。
    核心代码如下:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isValidBST(TreeNode* root) {
        return helper(root,LONG_MIN,LONG_MAX);
    }
    bool helper(TreeNode* root, long long lower, long long upper) {
        if (root == NULL) 
            return true;
        if(root->val > lower && root->val < upper) {
            return helper(root->left,lower,root->val) && helper(root->right,root->val,upper);
        }
        return false;
    }
};

此方法用时
在这里插入图片描述
另外还可以通过中序遍历,因为中序遍历刚好是从小到大排序。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    long long ROOT_MIN = LONG_MIN;
    bool flag = true;
    bool isValidBST(TreeNode* root) {
        if(root == NULL)
            return true;
        isValidBST(root->left);
        if(root->val <= ROOT_MIN) {
            flag = false;
            return flag;
        }
        ROOT_MIN = root->val;
        isValidBST(root->right);
        return flag;
    }
};

耗时如下
在这里插入图片描述