题目链接
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);
}
};