in this assignment you are asked to write a simple driver program and set of functions (maybein a library) that can be performed on a binary search tree. Your program should allow user to insert/delete integer values into the binary search tree along with several other operations on the binary search tree. You can use the code given in slides. But this time your key will be int! Specifically, your program will ask user to enter a command and related parameters (if any) in a loop, and then perform the given commands. Here is the list of commands that your program must implement: * insert *find\' *delete *list inorder *list preorder *list postorder *list levelorder * max * min * height *count * sum *quit As always, make sure you release (free) the dynamically allocated memories if you allocate any memory in your programs. So, before submitting your program, run it with valgrind to see if there is any memory leakage //my proggram in C struct tree_node { int data; struct tree_node *left, *right; } typedef struct nodeT { int key; struct nodeT *left, *right; } nodeT, *treeT; int main(){ while (TRUE) { printf(\"> \"); line = GetLine(); ch = toupper(line[0]); switch (ch) { case \'I\': insert(); break; case \'F\': find(); break; case \'D\': delete(); break; case \'LI\': listInorder; break; case \'LPR\': listPreorder(); break; case \'LPO\': listPostorder(); break; case \'MAX\': max(); break; case \'min\': min(); break; case \'H\': height(); break; case \'C\': count(); break; case \'S\': sum(); break; case \'Q\': exit(0); default:printf(\"Illegal command\ \"); break; } } } nodeT *FindNode(nodeT *t, int key){ while(t !=NULL) { if (key == t->key) return t; if (key < t->key) { t = t->left; } else { t = t->right; } return NULL; } void delete(nodeT **p){ nodeT *target; target=*p; if (target->left==NULL && target->right==NULL) { *p=NULL; } else if (target->left == NULL) { *p=target->right; } else if (target->right == NULL) { *p=target->left; } else { /* target has two children, see next slide */ } free(target); } void listInorder(nodeT *T){ if (t != NULL) { DisplayTree(t->left); printf(“%d “, t->key); DisplayTree(t->right); } } void listPreorder(nodeT *t) { if (t != NULL) { printf(“%d “, t->key); DisplayTree(t->left); DisplayTree(t->right); } } void listPostOrder(nodeT *t){ if (t != NULL) { DisplayTree(t->left); DisplayTree(t->right); printf(“%d “, t->key); } } void intsert(nodeT **tptr, int key){ nodeT*t, *tmp; t=*tptr; if (t == NULL) { tmp=New(nodeT*); tmp->key = key; tmp->left=tmp->right=NULL; *tptr=tmp; return; } if (key < t->key) { InsertNode (&t->left, key); } else { InsertNode(&t->right, key); } } int height(nodeT *t){ if (t == NULL) return 0; else return (1 + maximumof( height(t->left), height(t->right)) ); } int sum(struct tree_node *p){ if (p == NULL) return 0; else return (p->data + sum(p->left) + sum(p->right) ); } Solution 1. /* 2. * Java Program to Implement Binary Search Tree 3. */ 4. 5. import java.util.Scanner; 6. 7. /* Class BSTNode */ 8. cl.