Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode *root) {
int lower = INT_MIN;
int upper = INT_MAX;
if(root == NULL){
return true;
}
if (!root->left && !root->right) {
return true;
}
TreeNode *left = root;
TreeNode *right = root;
//兼容有INT_MAX和INT_MIN的情况
while (left->left) {
left = left->left;
}
while (right->right) {
right = right->right;
}
return dfs(root, INT_MIN, INT_MAX, left, right);
}
bool dfs(TreeNode *root, int lower, int upper, TreeNode *left, TreeNode *right) {
if (!root) {
return true;
}
return (root->val > lower || root == left) && (root->val < upper || root == right) && dfs(root->left, lower, root->val, left, right) && dfs(root->right, root->val, upper, left, right);
}
};