解法一 divide and conquer
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def helper(root, lower, upper):
if not root: return True
if root.val<=lower or root.val>=upper: return False
return helper(root.left, lower, min(upper, root.val)) and helper(root.right, max(lower, root.val), upper)
return helper(root, float('-inf'), float('inf'))
class Solution {
public:
bool isValid(TreeNode* root, long mn, long mx){
if(!root) return true;
if(root->val<=mn || root->val>=mx) return false;
return isValid(root->left, mn, root->val) && isValid(root->right, root->val, mx);
}
bool isValidBST(TreeNode* root) {
return isValid(root, LONG_MIN, LONG_MAX);
}
};
use LONG_MIN and LONG_MAX
解法二 inorder traversal
class Solution {
public:
void inorder(TreeNode* root, vector<int> &vals){
if(root->left) inorder(root->left, vals);
vals.push_back(root->val);
if(root->right) inorder(root->right, vals);
}
bool isValidBST(TreeNode* root) {
if(!root) return true;
if(!root->left && !root->right) return true;
vector<int> vals;
inorder(root, vals);
for(int i=1;i<vals.size();i++){
if(vals[i]<=vals[i-1]) return false;
}
return true;
}
};