# 0098. Validate Binary Search Tree
###### tags: `Leetcode` `Medium` `FaceBook` `Binary Search Tree` `Tree Traversal`
Link: https://leetcode.com/problems/validate-binary-search-tree/
## 思路
Recursion
中序遍历binary search tree得到的阵列单调递增
用Integer而不是int的原因是他要检查是否是strictly binary search tree, 也就是left child的值一定小于root value,right child的值一定大于root value,所以low跟high不能设成```Integer.MIN_VALUE```和```Integer.MAX_VALUE```
## Code
### 思路一 $O(N)$ $O(N)$
```java=
class Solution {
public boolean isValidBST(TreeNode root) {
return checkValid(root,null,null);
}
public boolean checkValid(TreeNode root, Integer low, Integer high){
if(root==null) return true;
if(low!=null&&root.val<=low){
return false;
}
if(high!=null&&root.val>=high){
return false;
}
return checkValid(root.left,low,root.val) && checkValid(root.right,root.val,high);
}
}
```
### 思路二
```java=
class Solution {
class ColorNode{
TreeNode node;
int color;
public ColorNode(TreeNode node, int color){
this.node = node;
this.color = color;
}
}
public boolean isValidBST(TreeNode root) {
Integer prev = null;
Stack<ColorNode> stack = new Stack<>();
stack.push(new ColorNode(root, 0));
while(!stack.isEmpty()){
ColorNode cnode = stack.pop();
if(cnode.color == 0){
if(cnode.node.right != null) stack.push(new ColorNode(cnode.node.right,0));
stack.push(new ColorNode(cnode.node,1));
if(cnode.node.left != null) stack.push(new ColorNode(cnode.node.left,0));
}
else{
System.out.println(prev);
if(prev == null) prev = cnode.node.val;
else if(prev>=cnode.node.val) return false;
prev = cnode.node.val;
}
}
return true;
}
}
```