题目描述:
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.
- A single node tree is a BST
Example
题目思路:
An example:
2
/ \
1 4
/ \
3 5
The above binary tree is serialized as {2,1,4,#,#,3,5}
(in level order).
这题算是典型的recursion问题。需要注意的是,以root为分界线,如果node在左subtree的右边,那么它既要满足node->value > parent->value,又需要node->value < root->value;同理,如果node在右subtree的左边,也需要注意这一点。于是在recursion函数中,需要把min_val和max_val传递下去。Example:
{2,1,4,#,#,1,5}
上面的tree应该return false.
MyCode (AC = 80ms):
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: The root of binary tree.
* @return: True if the binary tree is BST, or false
*/
bool isValidBST(TreeNode *root) {
// write your code here
if (root == NULL) {
return true;
}
return isValidBSTHelper(root, LONG_MIN, LONG_MAX);
}
bool isValidBSTHelper(TreeNode *root, long long min_val, long long max_val) {
if (root == NULL) {
return true;
}
bool res = true;
// make sure the followings are valid:
// subtree
// left value < parent value
// left value > root value if node is in right tree
if (root->left) {
res = res && isValidBSTHelper(root->left, min_val, root->val) &&
root->left->val < root->val &&
root->left->val > min_val;
}
// make sure the followings are valid:
// subtree
// right value > parent value
// right value < root value if node is in left tree
if (root->right) {
res = res && isValidBSTHelper(root->right, root->val, max_val) &&
root->right->val > root->val &&
root->right->val < max_val;
}
return res;
}
};