package com.anuragkapur.ctci;
import com.anuragkapur.ds.tree.TreeFactory;
import com.anuragkapur.ds.tree.TreeNode;
/**
* @author: anuragkapur
* @since: 10/05/2014
*/
public class Prob4_5_IsBinarySearchTree {
private static int leftMax = Integer.MIN_VALUE;
private static int rightMin = Integer.MAX_VALUE;
public static boolean isBinarySearchTree(TreeNode rootNode) {
if(rootNode == null) {
return true;
}
TreeNode leftSubTree = rootNode.getLeft();
TreeNode rightSubTree = rootNode.getRight();
boolean leftResult = isBinarySearchTree(leftSubTree);
boolean rightResult = isBinarySearchTree(rightSubTree);
if (leftSubTree != null)
leftMax = (leftSubTree.getKey() > leftMax) ? leftSubTree.getKey() : leftMax;
if (rightSubTree != null)
rightMin = (rightSubTree.getKey() < rightMin) ? rightSubTree.getKey() : rightMin;
return leftResult && rightResult && (rootNode.getKey() >= leftMax && rootNode.getKey() <= rightMin);
}
public static void main(String[] args) {
//System.out.println("Expected :: false :: Actual :: " + isBinarySearchTree(TreeFactory.getBalancedBinaryTree()));
System.out.println("Expected :: true :: Actual :: " + isBinarySearchTree(TreeFactory.getBinarySearchTree()));
//System.out.println("Expected :: false :: Actual :: " + isBinarySearchTree(TreeFactory.getInvalidBinarySearchTree()));
}
}