Write a Program of Binary Search Tree Operations.
#include <iostream.h> #include <process.h> //for exit(1) #include <conio.h> struct node{ int data; struct node *left; struct node *right; }; class BST{ public: node *tree; BST(){ tree=NULL; } void createTree(node **,int item); //For Building Treevoid preOrder(node *); //For Tree Traversalvoid inOrder(node *); void postOrder(node *); void determineHeight(node *,int *); int totalNodes(node *); int internalNodes(node *); //no. of non-leaf nodesint externalNodes(node *); //no. of leaf nodes.void removeTree(node **); //Remove tree from memory. node **searchElement(node **,int); void findSmallestNode(node *); void findLargestNode(node *); void deleteNode(int); }; //it is used for inseting an single element in//a tree, but if calls more than once will create tree.void BST :: createTree(node **tree,int item){ if(*tree == NULL){ *tree = new node; (*tree)->data = item; (*tree)->left = NULL; (*tree)->right = NULL; } else{ if( (*tree)->data > item) createTree( &((*tree)->left),item); else createTree( &((*tree)->right),item); } } void BST :: preOrder(node *tree){ if( tree!=NULL){ cout<<" "<< tree->data; preOrder(tree->left); preOrder(tree->right); } } void BST :: inOrder(node *tree){ if( tree!=NULL){ inOrder( tree->left); cout<<" "<< tree->data; inOrder(tree->right); } } void BST :: postOrder(node *tree){ if( tree!=NULL){ postOrder( tree->left); postOrder( tree->right); cout<<" "<<tree->data; } } void BST :: determineHeight(node *tree, int *height){ int left_height, right_height; if( tree == NULL) *height = 0; else{ determineHeight(tree->left, &left_height); determineHeight(tree->right, &right_height); if( left_height > right_height) *height = left_height + 1; else *height = right_height + 1; } } int BST :: totalNodes(node *tree){ if( tree == NULL) return 0; elsereturn( totalNodes(tree->left) + totalNodes(tree->right) + 1 ); } int BST :: internalNodes(node *tree){ if( (tree==NULL) || (tree->left==NULL && tree->right==NULL)) return 0; elsereturn( internalNodes(tree->left) + internalNodes(tree->right) + 1 ); } int BST :: externalNodes(node *tree){ if( tree==NULL ) return 0; elseif( tree->left==NULL && tree->right==NULL) return 1; elsereturn( externalNodes(tree->left) + externalNodes(tree->right)); } void BST :: removeTree(node **tree){ if( (*tree) != NULL){ removeTree( &(*tree)->left ); removeTree( &(*tree)->right ); delete( *tree ); } } node ** BST :: searchElement(node **tree, int item){ if( ((*tree)->data == item) || ( (*tree) == NULL) ) return tree; elseif( item < (*tree)->data) return searchElement( &(*tree)->left, item); elsereturn searchElement( &(*tree)->right, item); } void BST :: findSmallestNode(node *tree){ if( tree==NULL || tree->left==NULL) cout<< tree->data; else findSmallestNode( tree->left); } //Finding In_order Successor of given node..//for Delete Algo. node * find_Insucc(node *curr) { node *succ=curr->right; //Move to the right sub-tree.if(succ!=NULL){ while(succ->left!=NULL) //If right sub-tree is not empty. succ=succ->left; //move to the left-most end. } return(succ); } void BST :: findLargestNode(node *tree){ if( tree==NULL || tree->right==NULL) cout<<tree->data; else findLargestNode(tree->right); } void BST :: deleteNode(int item){ node *curr=tree,*succ,*pred; int flag=0,delcase; //step to find location of nodewhile(curr!=NULL && flag!=1) { if(item < curr->data){ pred = curr; curr = curr->left; } elseif(item > curr->data){ pred = curr; curr = curr->right; } else{ //curr->data = item flag=1; } } if(flag==0){ cout<<"\nItem does not exist : No deletion\n"; getch(); goto end; } //Decide the case of deletionif(curr->left==NULL && curr->right==NULL) delcase=1; //Node has no childelseif(curr->left!=NULL && curr->right!=NULL) delcase=3; //Node contains both the childelse delcase=2; //Node contains only one child//Deletion Case 1if(delcase==1){ if(pred->left == curr) //if the node is a left child pred->left=NULL; //set pointer of its parentelse pred->right=NULL; delete(curr); //Return deleted node to the memory bank. } //Deletion Case 2if(delcase==2){ if(pred->left==curr){ //if the node is a left childif(curr->left==NULL) pred->left=curr->right; else pred->left=curr->left; } else{ //pred->right=currif(curr->left==NULL) pred->right=curr->right; else pred->right=curr->left; } delete(curr); } //Deletion case 3if(delcase==3){ succ = find_Insucc(curr); //Find the in_order successor//of the node.int item1 = succ->data; deleteNode(item1); //Delete the inorder successor curr->data = item1; //Replace the data with the data of//in order successor. } end: } void main(){ BST obj; int choice; int height=0,total=0,n,item; node **tmp; while(1){ clrscr(); cout<<"*****BINARY SEARCH TREE OPERATIONS*****\n\n"; cout<<"--Binary Tree and Binary Search Tree common operations--\n"; cout<<"1) Create Tree\n"; cout<<"2) Traversal\n"; cout<<"3) Height of Tree\n"; cout<<"4) Total Nodes\n"; cout<<"5) Internal Nodes \n"; cout<<"6) External Nodes \n"; cout<<"7) Remove Tree\n"; cout<<"\n--Only Binary Search Tree Operations--\n"; cout<<"8) Insert Node\n"; cout<<"9) Search Node\n"; cout<<"10) Find Smallest Node\n"; cout<<"11) Find Largest Node\n"; cout<<"12) Delete Node\n"; cout<<"13) Exit\n"; cout<<"Enter your choice : "; cin>>choice; switch(choice){ case 1 : //Create Tree cout<<"\n\n--Creating Tree--"; cout<<"\nHow many nodes u want to enter : "; cin>>n; for(int i=0;i<n;i++){ cout<<"Enter value : "; cin>>item; obj.createTree(&obj.tree,item); } break; case 2 : //All Traversals cout<<"\n\nInorder Traversal : "; obj.inOrder(obj.tree); cout<<"\n\nPre-order Traversal : "; obj.preOrder(obj.tree); cout<<"\n\nPost-order Traversal : "; obj.postOrder(obj.tree); getch(); break; case 3 : //Determining Height of Tree obj.determineHeight(obj.tree,&height); cout<<"\n\nHeight of Tree : "<<height; getch(); break; case 4 : //Total nodes in a tree total=obj.totalNodes(obj.tree); cout<<"\n\nTotal Nodes : "<<total; getch(); break; case 5 : //Internal nodes in a tree total=obj.internalNodes(obj.tree); cout<<"\n\nInternal Nodes : "<<total; getch(); break; case 6 : //External nodes in a tree total=obj.externalNodes(obj.tree); cout<<"\n\nExternal Nodes : "<<total; getch(); break; case 7 : //Remove Tree from memory obj.removeTree(&obj.tree); cout<<"\n\nTree is removed from Memory"; getch(); break; case 8 : //Inserting a node in a tree cout<<"\n\n--Inserting Node in a tree--\n"; cout<<"Enter value : "; cin>>item; obj.createTree(&obj.tree,item); cout<<"\nItem is inserted\n"; getch(); break; case 9 : //Search element cout<<"\n\n--Search Element--\n"; cout<<"Enter item to searched : "; cin>>item; &(*tmp) = obj.searchElement(&obj.tree,item); if( (*tmp) == NULL) cout<<"\nSearch Element Not Found"; else cout<<"\nSearch Element was Found"; getch(); break; case 10 : //Find Smallest Node cout<<"\n\nSmallest Node is : "; obj.findSmallestNode(obj.tree); getch(); break; case 11 : //Find Largest Node cout<<"\n\nLargest Node is : "; obj.findLargestNode(obj.tree); getch(); break; case 12 : //Deleting a node from a tree cout<<"\n\n--Deleting a Node from a tree--\n"; cout<<"Enter value : "; cin>>item; obj.deleteNode(item); break; case 13 : exit(1); }//end of switch } }