Validate Binary Search Tree
Aug 31 '12
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.
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
recursive approach:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//null, root, {1,2,3} {2,3,1} {1,1} {1,#,1}
public class Solution {
public boolean isValidBST(TreeNode root) {
// Start typing your Java solution below
// DO NOT write main() function
return valRec( root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
private boolean valRec(TreeNode root, int low, int high) {
if(root==null) return true;
int x = root.val;
if( x<=low || x>=high ) return false;
return valRec(root.left, low, x) && valRec(root.right, x, high);
}
}
non-recursive approach:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//null, root, {1,2,3} {2,3,1} {1,1} {1,#,1}
public class Solution {
public boolean isValidBST(TreeNode root) {
// Start typing your Java solution below
// DO NOT write main() function
if(root==null) return true;
Stack<TreeNode> stack = new Stack<TreeNode>();
Stack<Pair> pairStack = new Stack<Pair>();
stack.push( root);
pairStack.push( new Pair(Integer.MIN_VALUE, Integer.MAX_VALUE) );
while(!stack.isEmpty() ){
TreeNode n = stack.pop();
Pair pair = pairStack.pop();
int x = n.val;
if( x<=pair.low || x>=pair.high) return false;
if( n.left!=null) {
stack.push( n.left);
pairStack.push( new Pair(pair.low, x) );
}
if( n.right!=null) {
stack.push( n.right);
pairStack.push( new Pair(x, pair.high) );
}
}
return true;
}
class Pair{
int low;
int high;
Pair(int low, int high) {
this.low=low;
this.high=high;
}
}
}