Given the following code package data1; import java.util.*; /*public class BST> implementing a set ADT and containing the following: * private inner class BinaryNode representing a node with a (possibly) left child and a (possibly) right child ** instance fields BinaryNode root, int size * contains/insert/remove method - w/ O(height) complexity ** size O(1), isEmpty O(1), clear O(1), *** findMin, findMax, findHeight methods - w/ O(height) complexity **** toString() method printing set (in-order traversal) and the tree (BFS traversal) ** */ publicclass BST> { private BinaryNode root; privateint size; //Search opertion of Set ADT publicboolean contains(E value) { return contains(root, value); } //Insert opertion of Set ADT publicvoid insert(E value) { root = insert(root, value); size++; } //Remove operation of Set ADT publicvoid remove(E value){ root = remove(root, value); size--; } publicint size(){ return size; } publicboolean isEmpty(){ return root == null; } publicvoid clear(){ root = null; size = 0; } public E findMin(){ return findMin(root); } public E findMax(){ return findMax(root); } publicint findHeight(){ return root.height(); } public String toString(){ if(root == null) return "set {} stored in an empty tree.\n"; String elements = root.inOrder().toString(); return "set {" + elements.substring(1,elements.length()-1) + "} stored in tree \n" + root; } private E findMin(BinaryNode node){ if(node == null) returnnull; if(node.left == null) return node.element; return findMin(node.left); } private E findMax(BinaryNode node){ if(node == null) returnnull; if(node.right == null) return node.element; return findMax(node.right); } privateboolean contains(BinaryNode node, E value) { if (node == null)//node represents an empty substree returnfalse; int comparisonResult = value.compareTo(node.element); if(comparisonResult < 0)//if value is less than root's value return contains(node.left, value); if(comparisonResult > 0)//if value is greater than root's value return contains(node.right, value); returntrue;//successful search } private BinaryNode insert(BinaryNode node, E value) { if (node == null)//base case: empty tree returnnew BinaryNode<>(value); if (value.compareTo(node.element) < 0) node.left = insert(node.left, value);//insert recursively to left-subtree elseif (value.compareTo(node.element) > 0) node.right = insert(node.right, value);//insert recursively to right-subtree else {//duplicate value cannot be inserted in a BST implementing the Set ADT size--;//insertion failed! //System.out.print("BST.insert: Warning: " + value + " is already stored in the tree \n" + node); } return node; } private BinaryNode remove(BinaryNode node, E value) { if (node == null) {//base case: empty tree System.out.println("BST.remove: Warning: " + value + " doesn't exist in the tree."); size++;//removal failed! return node; } if (value.compareTo(node.element) < 0) node.left = remove(node.left, value); elseif (value.compareTo(node.element) > 0) node.right = remov.