# Validate Binary Search Tree

TAGS: TAG_Divide_and_Conquer TAG_Recursion TAG_Binary_Search_Tree TAG_Binary_Tree TAG_Medium

## Question

### Problem Statement

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).

## 题解1 - recursion

1. 基本条件/终止条件 - 返回值需斟酌。
2. 递归步/条件递归 - 能使原始问题收敛。

### C++ - long long

/**
* 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) {
if (root == NULL) return true;

return helper(root, LLONG_MIN, LLONG_MAX);
}

bool helper(TreeNode *root, long long lower, long long upper) {
if (root == NULL) return true;

if (root->val <= lower || root->val >= upper) return false;
bool isLeftValidBST = helper(root->left, lower, root->val);
bool isRightValidBST = helper(root->right, root->val, upper);

return isLeftValidBST && isRightValidBST;
}
};


### C++ - without long long

/**
* 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) {
if (root == NULL) return true;

return helper(root, INT_MIN, INT_MAX);
}

bool helper(TreeNode *root, int lower, int upper) {
if (root == NULL) return true;

if (root->val <= lower || root->val >= upper) {
bool right_max = root->val == INT_MAX && root->right == NULL;
bool left_min = root->val == INT_MIN && root->left == NULL;
if (!(right_max || left_min)) {
return false;
}
}
bool isLeftValidBST = helper(root->left, lower, root->val);
bool isRightValidBST = helper(root->right, root->val, upper);

return isLeftValidBST && isRightValidBST;
}
};


### Java

/**
* Definition of TreeNode:
* public class TreeNode {
*     public int val;
*     public TreeNode left, right;
*     public TreeNode(int val) {
*         this.val = val;
*         this.left = this.right = null;
*     }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: True if the binary tree is BST, or false
*/
public boolean isValidBST(TreeNode root) {
if (root == null) return true;

return helper(root, Long.MIN_VALUE, Long.MAX_VALUE);
}

private boolean helper(TreeNode root, long lower, long upper) {
if (root == null) return true;
// System.out.println("root.val = " + root.val + ", lower = " + lower + ", upper = " + upper);
// left node value < root node value < right node value
if (root.val >= upper || root.val <= lower) return false;
boolean isLeftValidBST = helper(root.left, lower, root.val);
boolean isRightValidBST = helper(root.right, root.val, upper);

return isLeftValidBST && isRightValidBST;
}
}


## 题解2 - iteration

### Java

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isValidBST(TreeNode root) {
Deque<TreeNode> st = new ArrayDeque<>();
long pre = Long.MIN_VALUE;
// inorder traverse
while (root != null || !st.isEmpty()) {
if (root != null) {
st.push(root);
root = root.left;
}
else {
root = st.pop();
if (root.val > pre)
pre = root.val;
else
return false;
root = root.right;
}
}
return true;
}
}