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.
Example 1:
2 / \ 1 3Binary tree
[2,1,3]
,
return true.
Example 2:
1 / \ 2 3Binary tree
[1,2,3]
,
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:
bool check(TreeNode *p, int min, int max)
{
if (!p)
return 1;
else if (p->val > max || p->val < min)
return 0;
TreeNode *l = p->left;
TreeNode *r = p->right;
if ( (l && p->val <= l->val) || (r && p->val >= r->val) ) //提前比较,当前节点可能是INT_MIN,左子节点就无法再减1,会出现未知错误
return 0;
return (check(l, min, p->val - 1) && check(r, p->val + 1, max));
}
bool isValidBST(TreeNode* root)
{
return check( root, INT_MIN, INT_MAX );
}
};