Java program to construct a Binary Search Tree and perform deletion and In-order traversal


Java program to construct a Binary Search Tree and perform deletion and In-order traversal

public class BinarySearchTree
{ 
 
    //Represent a node of binary tree 
    public static class Node
    { 
        int data; 
        Node left; 
        Node right; 
 
        public Node(int data){ 
            //Assign data to the new node, set left and right children to null 
            this.data = data; 
            this.left = null; 
            this.right = null; 
        } 
      }  
 
      //Represent the root of binary tree 
      public Node root; 
 
      public BinarySearchTree(){ 
          root = null; 
      } 
 
      //insert() will add new node to the binary search tree 
      public void insert(int data) { 
          //Create a new node 
          Node newNode = new Node(data); 
 
          //Check whether tree is empty 
          if(root == null){ 
              root = newNode; 
              return; 
            } 
          else { 
              //current node point to root of the tree 
              Node current = root, parent = null; 
 
              while(true) { 
                  //parent keep track of the parent node of current node. 
                  parent = current; 
 
                  //If data is less than current's data, node will be inserted to the left of tree 
                  if(data < current.data) { 
                      current = current.left; 
                      if(current == null) { 
                          parent.left = newNode; 
                          return; 
                      } 
                  } 
                  //If data is greater than current's data, node will be inserted to the right of tree 
                  else { 
                      current = current.right; 
                      if(current == null) { 
                          parent.right = newNode; 
                          return; 
                      } 
                  } 
              } 
          } 
      } 
 
      //minNode() will find out the minimum node 
      public Node minNode(Node root) { 
          if (root.left != null) 
              return minNode(root.left); 
          else 
              return root; 
      } 
 
      //deleteNode() will delete the given node from the binary search tree 
      public Node deleteNode(Node node, int value) { 
          if(node == null){ 
              return null; 
           } 
          else { 
              //value is less than node's data then, search the value in left subtree 
              if(value < node.data) 
                  node.left = deleteNode(node.left, value); 
 
              //value is greater than node's data then, search the value in right subtree 
              else if(value > node.data) 
                  node.right = deleteNode(node.right, value); 
 
              //If value is equal to node's data that is, we have found the node to be deleted 
              else { 
                  //If node to be deleted has no child then, set the node to null 
                  if(node.left == null && node.right == null) 
                      node = null; 
 
                  //If node to be deleted has only one right child 
                  else if(node.left == null) { 
                      node = node.right; 
                  } 
 
                  //If node to be deleted has only one left child 
                  else if(node.right == null) { 
                      node = node.left; 
                  } 
 
                  //If node to be deleted has two children node 
                  else { 
                      //then find the minimum node from right subtree 
                      Node temp = minNode(node.right); 
                      //Exchange the data between node and temp 
                      node.data = temp.data; 
                      //Delete the node duplicate node from right subtree 
                      node.right = deleteNode(node.right, temp.data); 
                  } 
              } 
              return node; 
          } 
      } 
 
      //inorder() will perform inorder traversal on binary search tree 
      public void inorderTraversal(Node node) { 
 
          //Check whether tree is empty 
          if(root == null){ 
              System.out.println("Tree is empty"); 
              return; 
           } 
          else { 
 
              if(node.left!= null) 
                  inorderTraversal(node.left); 
              System.out.print(node.data + " "); 
              if(node.right!= null) 
                  inorderTraversal(node.right); 
 
          } 
      } 
 
      public static void main(String[] args) { 
 
          BinarySearchTree bt = new BinarySearchTree(); 
          //Add nodes to the binary tree 
          bt.insert(50); 
          bt.insert(30); 
          bt.insert(70); 
          bt.insert(60); 
          bt.insert(10); 
          bt.insert(90); 
 
          System.out.println("Binary search tree after insertion:"); 
          //Displays the binary tree 
          bt.inorderTraversal(bt.root); 
 
          Node deletedNode = null; 
          //Deletes node 90 which has no child 
          deletedNode = bt.deleteNode(bt.root, 90); 
          System.out.println("\nBinary search tree after deleting node 90:"); 
          bt.inorderTraversal(bt.root); 
 
          //Deletes node 30 which has one child 
          deletedNode = bt.deleteNode(bt.root, 30); 
          System.out.println("\nBinary search tree after deleting node 30:"); 
          bt.inorderTraversal(bt.root); 
 
          //Deletes node 50 which has two children 
          deletedNode = bt.deleteNode(bt.root, 50); 
          System.out.println("\nBinary search tree after deleting node 50:"); 
          bt.inorderTraversal(bt.root); 
      } 
} 

OUTPUT:-



Comments