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 3
Input: [2,1,3]
Output: true
Example 2:
5
/
1 4
/
3 6
Input: [5,1,4,null,null,3,6]
Output: false
Explanation: The root node’s value is 5 but its right child’s value is 4.
验证二叉搜索树,二叉搜索树的特性就是根节点左边的节点都要小于根节点,右边的都要大于根节点,并且这种一致性时要一致保持下去的。如果仅仅判断root介于left和right之间就认为当前节点符合二叉搜索树是不严谨的,还需要保证整颗左边的数所有节点小于root,右边都大于root。
解法一:二叉搜索树的中序遍历结果应该是有序的,故可根据这一点来判断
bool isValidBST(TreeNode* root) {
vector<int> res;
if (!root) return true;
helper(root,res);
for (int i=0;i<res.size()-1;i++)
{
if(res[i]>=res[i+1]) return false;
}
return true;
}
void helper(TreeNode* root,vector<int>& res)
{
if (!root) return;
helper(root->left,res);
res.push_back(root->val);
helper(root->right,res);
}
解法二:根据二叉树的特性,对于每个节点都传入它应所在的区间(最大值与最小值),若不在这个区间,则false,若在,继续往下判断。看代码~
bool isValidBST(TreeNode* root) {
return helper(root,LONG_MIN,LONG_MAX);
}
bool helper(TreeNode *root,long min,long max)
{
if (!root) return true;
if (root->val<=min||root->val>=max) return false;
return helper(root->left,min,root->val)&&helper(root->right,root->val,max);
}