leetcode98.验证二叉树

题目链接

https://leetcode-cn.com/problems/validate-binary-search-tree/

个人题解

解法1

思路

根据二叉搜索树定义,左子树值均小于根,右子树值均大于根。由此便想到自下而上维护每个子树中最大最小值,确保树根左子树最大值小于根,右子树最小值大于根。

代码

class Solution {
    bool isValidBST0(TreeNode* root,int &maxv,int &minv) {
        if (root->left == nullptr && root->right == nullptr) {
            maxv = root->val;
            minv = root->val;
            return true;
        }
        int lmaxv,lminv,rmaxv,rminv;
        if(root->left && !isValidBST0(root->left,lmaxv,lminv))return false;
        if(root->right && !isValidBST0(root->right,rmaxv,rminv))return false;
        if(root->left && lmaxv >= root->val) return false;
        if(root->right && rminv <= root->val) return false;
        if(root->right)maxv = rmaxv;else maxv = root->val;
        if(root->left) minv = lminv;else minv = root->val;
        return true;
    }
public:
    bool isValidBST(TreeNode* root) {
        int maxv,minv;
        return isValidBST0(root,maxv,minv);
    }
};

解法2:

思路

解法1思路的改进。
左子树值均小于根,右子树值均大于根<=>根值是左子树上界,根值是右子树下界。
对树自上而下递归判断,当每个子树保证界限时,为二叉搜索树。因为值均为int整数,完整树的界限为(INT_MIN,INT_MAX),开区间。

代码

class Solution {
    bool isValidBST1(TreeNode* root,long long minv,long long maxv) {
        if (root == nullptr){
            return true;
        }
        if(root->val<=minv||root->val >=maxv)return false;
        return isValidBST1(root->left,minv,root->val) && isValidBST1(root->right,root->val,maxv);
    }
public:
    bool isValidBST(TreeNode* root) {
        return isValidBST1(root,-2147483649,2147483648);
    }
};
posted @ 2021-01-08 19:23  deepwzh  阅读(75)  评论(0编辑  收藏  举报