Friday, 20 December 2013

Java Program to Implement Binary Search Tree

Node.java
public class Node {
    public int info;
    public Node left;
    public Node right;
}

BinarySearchTree.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
public class BinarySearchTree {
    private Scanner scanner;
    private Node root;
    private int info;

    private BinarySearchTree() {
        scanner = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
    }

    public static void main(String[] args) {
        new BinarySearchTree().showMenu();
    }

    private void showMenu() {
        int choice;
        do {
            System.out.println("1.\tInsert in Binary Tree");
            System.out.println("2.\tDelete from Binary Tree");
            System.out.println("3.\tSearch");
            System.out.println("4.\tSearch Min");
            System.out.println("5.\tSearch Max");
            System.out.println("6.\tPre-order traversal of Binary Tree");
            System.out.println("7.\tPost-order traversal of Binary Tree");
            System.out.println("8.\tIn-order traversal of Binary Tree");
            System.out.println("9.\tExit");
            System.out.print("\nEnter choice:");
          
            choice = scanner.nextInt();
            switch(choice) {
            case 1:    //insert
                System.out.print("\nEnter info:");
                info = scanner.nextInt();
                root = insert(root, info);
                break;
            case 2:    //delete
                System.out.print("\nEnter info:");
                info = scanner.nextInt();
                root = delete(root, info);
                break;
            case 3:    //search
                System.out.print("\nEnter info:");
                info = scanner.nextInt();
                Node searchroot = search(root, info);
                if(searchroot != null)
                    System.out.println("Found!");
                else
                    System.out.println("Not Found!");
                break;
            case 4:    //search min
                Node min = searchMin(root);
                if(min != null)
                    System.out.println("Min >> " + min.info);
                else
                    System.out.println("Empty tree!");
                break;
            case 5:    //search max
                Node max = searchMax(root);
                if(max != null)
                    System.out.println("Max >> " + max.info);
                else
                    System.out.println("Empty tree!");
                break;
            case 6:    //preorder
                preorder(root);
                break;
            case 7:    //postorder
                postorder(root);
                break;
            case 8:    //inorder
                inorder(root);
                break;
            case 9:    //exit
                System.exit(0);
                break;
            default:
                System.out.println("Invalid option");
                break;
            }
        } while(true);
    }  

    private Node insert(Node root, int info) {
        if(root == null) {
            root = new Node();
            root.info = info;
        } else if(info < root.info) {
            root.left = insert(root.left, info);
        } else {
            root.right = insert(root.right, info);
        }
        return root;
    }
   
    private Node delete(Node root, int info) {
        if(root == null) {
            System.out.println("Element not found!");
        } else if(info < root.info) {
            root.left = delete(root.left, info);
        } else if(info > root.info) {
            root.right = delete(root.right, info);
        } else {
            if(root.left != null && root.right != null) {
                Node temp = searchMin(root.right);
                root.info = temp.info;
                root.right = delete(root.right, temp.info);
            } else {
                if(root.left == null) {
                    root = root.right;
                } else if(root.right == null) {
                    root = root.left;
                }
            }
        }
        return root;
    }

    private Node search(Node root, int info) {
        if(root == null) {
            return null;
        } else if(root.info == info) {
            return root;
        } else if(info < root.info) {
            return search(root.left, info);
        } else {
            return search(root.right, info);
        }
    }

    private Node searchMin(Node root) {
        if(root != null && root.left != null) {
            return searchMin(root.left);
        } else {
            return root;
        }
    }

    private Node searchMax(Node root) {
        if(root != null && root.right != null) {
            return searchMax(root.right);
        } else {
            return search(root.right, info);
        }
    }
  
    private void preorder(Node root) {
        if(root != null) {
            System.out.print(root.info + " -> ");
            preorder(root.left);
            preorder(root.right);
        }
    }

    private void postorder(Node root) {
        if(root != null) {
            postorder(root.left);
            postorder(root.right);
            System.out.print(root.info);
        }
    }

    private void inorder(Node root) {
        if(root != null) {
            inorder(root.left);
            System.out.print(root.info + " -> ");
            inorder(root.right);
        }
    }

}