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.
bool IsBinarySearchTree3(TreeNode *root)
{
int minNum = 0x80000000;
int maxNum = 0x7FFFFFFF;
return IsBinarySearchTree3Help(root, minNum, maxNum);
}
bool IsBinarySearchTree3Help(TreeNode *root, int minNum, int maxNum)
{
if (root == NULL)
return true;
if (root->left != NULL)
{
int leftMin = minNum;
int leftMax = min(root->val, maxNum);
if (root->left->val <= leftMin || root->left->val >= leftMax)
{
return false;
}
if (!IsBinarySearchTree3Help(root->left, leftMin, leftMax))
{
return false;
}
}
if (root->right != NULL)
{
int rightMin = max(minNum, root->val);
int rightMax = maxNum;
if (root->right->val <= rightMin || root->right->val >= rightMax)
{
return false;
}
if (!IsBinarySearchTree3Help(root->right, rightMin, rightMax))
return false;
}
return true;
}
bool isBinaryTree(TreeNode *node, int minVal, int maxVal)
{
if (node == NULL)
return true;
return (minVal < node->val && node->val < maxVal) && isBinaryTree(node->left, minVal, node->val) &&
isBinaryTree(node->right, node->val, maxVal);
}