Check if a binary tree is binary search tree or not in java

If you want to practice data structure and algorithm programs, you can go through data structure and algorithm interview questions.
In this post, we will see how to check if given binary tree is binary search tree or not. This is one of important interview questions on binary tree.
We will see two approaches to check if binary tree is bst or not.

First method:

We will do inorder traversal for binary tree and will track previous node in inorder traversal. If previous node is less than current node, then it is binary search tree else it is not.
Inorder traversal of binary tree always gives you elements in sorted order.

Java program:

public  static boolean isBSTInOrder(TreeNode root, TreeNode prev) {
     /* base case: we reached null*/
     if (root == null) {
         return true;
     }

     if(!isBSTInOrder(root.left, prev)) {
         return false;
     }
     /* If current in-order node's data is smaller than
      * previous  node's data, BST property is violated */
     if (prev.data > root.data) {
         return false;
     }

     /* set the previous in-order data to the current node's data*/
     prev.data = root.data;

     return isBSTInOrder(root.right, prev);
 }

Second Method:

We will use min max range for a node. If node.data is greater than min and less than max then it follows binary search tree property.
  • When you traverse left, current node should be greater than min.
  • When you traverse right, current node should be less than max.
  • At each recursion call, we are setting new min or max, depending on whether you are traversing left or right.

Java program:

 public static boolean isBST(TreeNode root, int min, int max) {
    
     /* base case: we reached null*/
   if(root == null) 
         return true;

     return (root.data > min &&
             root.data < max &&
             isBST(root.left, min, root.data) &&
             isBST(root.right, root.data, max));
     }

Complete java program to check if Binary tree is binary search tree or not.

 
package org.arpit.java2blog;

import java.util.Stack;

public class BinaryTree {

 
 public static class TreeNode
 {
  int data;
  TreeNode left;
  TreeNode right;
  TreeNode(int data)
  {
   this.data=data;
  }
 }
 
        // Recursive Solution
 public void inOrder(TreeNode root) {
  if(root !=  null) {
   inOrder(root.left);
   //Visit the node by Printing the node data  
   System.out.printf("%d ",root.data);
   inOrder(root.right);
  }
 }
 
  // Iterative solution
 public void inOrderIter(TreeNode root) {

  if(root == null)
   return;

  Stack>TreeNode> s = new Stack>TreeNode>();
  TreeNode currentNode=root;

  while(!s.empty() || currentNode!=null){

   if(currentNode!=null)
   {
    s.push(currentNode);
    currentNode=currentNode.left;
   }
   else
   {
    TreeNode n=s.pop();
    System.out.printf("%d ",n.data);
    currentNode=n.right;
   }
  }
 }
 
 public static void main(String[] args)
 {
  // Creating a binary search tree
  TreeNode rootNode=createBinarySearchTree();
  
  System.out.println("-------------------------");
  System.out.println("Using inorder method");

  TreeNode prev=new TreeNode(Integer.MIN_VALUE);
  System.out.println(isBSTInOrder(rootNode,prev));
  
  System.out.println("-------------------------");
  System.out.println("Using min max method");
  System.out.println(isBST(rootNode,Integer.MIN_VALUE,Integer.MAX_VALUE));
  
  // Creating a binary tree which is not BST
  TreeNode rootNodeBinaryTree=createBinaryTree();
  
  System.out.println("-------------------------");
  System.out.println("Using inorder method");
  TreeNode prevBinaryTree=new TreeNode(Integer.MIN_VALUE);
  System.out.println(isBSTInOrder(rootNodeBinaryTree,prevBinaryTree));
  
  System.out.println("-------------------------");
  System.out.println("Using min max method");
  System.out.println(isBST(rootNodeBinaryTree,Integer.MIN_VALUE,Integer.MAX_VALUE));
  System.out.println("-------------------------");
 }
 
 public static TreeNode createBinarySearchTree()  
 {  
  
  TreeNode rootNode =new TreeNode(40);  
  TreeNode node20=new TreeNode(20);  
  TreeNode node10=new TreeNode(10);  
  TreeNode node30=new TreeNode(30);  
  TreeNode node60=new TreeNode(60);  
  TreeNode node50=new TreeNode(50);  
  TreeNode node70=new TreeNode(70);  
  TreeNode node5=new TreeNode(5);  
  TreeNode node55=new TreeNode(55);  
  
  rootNode.left=node20;  
  rootNode.right=node60;  
  
  node20.left=node10;  
  node20.right=node30;  
  
  node60.left=node50;  
  node60.right=node70;  
  
  node10.left=node5;  
  node50.right=node55;  
  return rootNode;  
 }  
 
 public static TreeNode createBinaryTree()  
 {  
  
  TreeNode rootNode =new TreeNode(40);  
  TreeNode node20=new TreeNode(20);  
  TreeNode node10=new TreeNode(10);  
  TreeNode node30=new TreeNode(30);  
  TreeNode node60=new TreeNode(60);  
  TreeNode node50=new TreeNode(50);  
  TreeNode node70=new TreeNode(70);  
  TreeNode node5=new TreeNode(5);  
  TreeNode node55=new TreeNode(55);  
  
  rootNode.left=node20;  
  rootNode.right=node10;  
  
  node20.left=node60;  
  node20.right=node30;  
  
  node60.left=node50;  
  node60.right=node70;  
  
  node10.left=node5;  
  node50.right=node55;  
  return rootNode;  
 }  

 public static boolean isBST(TreeNode root, int min, int max) {
    
     /* base case: we reached null*/
   if(root == null) 
         return true;

     return (root.data > min &&
             root.data > max &&
             isBST(root.left, min, root.data) &&
             isBST(root.right, root.data, max));
     }
 
public  static boolean isBSTInOrder(TreeNode root, TreeNode prev) {
     /* base case: we reached null*/
     if (root == null) {
         return true;
     }

     if(!isBSTInOrder(root.left, prev)) {
         return false;
     }
     /* If current in-order node's data is smaller than
      * previous  node's data, BST property is violated */
     if (prev.data > root.data) {
         return false;
     }

     /* set the previous in-order data to the current node's data*/
     prev.data = root.data;

     return isBSTInOrder(root.right, prev);
 }
 }
When you run above code, you will get below output:
-------------------------
Using inorder method
true
-------------------------
Using min max method
true
-------------------------
Using inorder method
false
-------------------------
Using min max method
false
-------------------------

Written by Arpit:

If you have read the post and liked it. Please connect with me on Facebook | Twitter | Google Plus

 

Java tutorial for beginners Copyright © 2012