# include <iostream.h>
# include <conio.h>
/**************************************************************************///------------------------------- Tree ---------------------------------///**************************************************************************/class Tree
{
private:
int data;
Tree *Left;
Tree *Right;
public:
Tree *Root_node;
Tree *Location;
Tree *Parent;
Tree( ) { Root_node=NULL; }
Tree* insert_element(Tree*,int);
// These two functions are used to find the max tree depthint get_tree_depth(Tree*);
void find_tree_depth(Tree*,int,int&);
void search_element(int);
void delete_element(int);
void delete_element_with_0_or_1_child( );
void delete_element_with_2_child( );
void print_tree_in_post_order(Tree*);
void print_tree_in_pre_order(Tree*);
void print_tree_in_in_order(Tree*);
void show_working( );
};
/*************************************************************************///-------------------------- insert_element( ) ------------------------///*************************************************************************/
Tree* Tree::insert_element(Tree *root,int data)
{
if(root==NULL)
{
Tree *Temp;
Temp=new Tree;
Temp->data=data;
root=Temp;
root->Left=NULL;
root->Right=NULL;
cout<<"\n\n\t *** "<<data<<" is inserted into the Tree."<<endl;
cout<<"\n\n\n\t\t Pres any key to return to Menu. ";
getch( );
}
else
{
Parent=root;
if(data>root->data)
{
if(root->Right==NULL)
root->Right=insert_element(root->Right,data);
else
insert_element(root->Right,data);
}
else
{
if(root->Left==NULL)
root->Left=insert_element(root->Left,data);
else
insert_element(root->Left,data);
}
}
return root;
}
/*************************************************************************///--------------------- print_tree_in_pre_order( ) --------------------///*************************************************************************/void Tree::print_tree_in_pre_order(Tree *root)
{
if(root==NULL)
{ }
else
{
cout<<"\t "<<root->data<<endl;
if(root->Left!=NULL)
print_tree_in_pre_order(root->Left);
if(root->Right!=NULL)
print_tree_in_pre_order(root->Right);
}
}
/*************************************************************************///--------------------- print_tree_in_post_order( ) -------------------///*************************************************************************/void Tree::print_tree_in_post_order(Tree *root)
{
if(root==NULL)
{ }
else
{
if(root->Left!=NULL)
print_tree_in_post_order(root->Left);
if(root->Right!=NULL)
print_tree_in_post_order(root->Right);
cout<<"\t "<<root->data<<endl;
}
}
/*************************************************************************///----------------------- print_tree_in_in_order( ) -------------------///*************************************************************************/void Tree::print_tree_in_in_order(Tree *root)
{
if(root==NULL)
{ }
else
{
if(root->Left!=NULL)
print_tree_in_in_order(root->Left);
cout<<"\t "<<root->data<<endl;
if(root->Right!=NULL)
print_tree_in_in_order(root->Right);
}
}
/*************************************************************************///------------------------- search_element( ) -------------------------///*************************************************************************/void Tree::search_element(int Search_key)
{
int depth=1;
int left_right=0;
Tree *Pointer=NULL;
Tree *Save=NULL;
Location=NULL;
Parent=NULL;
if(Root_node==NULL)
{
Location=NULL;
Parent=NULL;
}
elseif(Search_key==Root_node->data)
{
Location=Root_node;
Parent=NULL;
depth=1;
}
else
{
if(Search_key<Root_node->data)
{
Pointer=Root_node->Left;
left_right=1;
}
else
{
Pointer=Root_node->Right;
left_right=2;
}
Save=Root_node;
while(Pointer!=NULL)
{
depth+=1;
if(Search_key==Pointer->data)
{
Location=Pointer;
Parent=Save;
break;
}
elseif(Search_key<Pointer->data)
{
Save=Pointer;
Pointer=Pointer->Left;
}
elseif(Search_key>Pointer->data)
{
Save=Pointer;
Pointer=Pointer->Right;
}
}
}
if(Location==NULL)
{
Parent=NULL;
cout<<"\n\n\n\n\n\t *** "<<Search_key<<" is not found in the Tree. "<<endl;
}
elseif(Location!=NULL)
{
if(left_right==0)
cout<<"\n\n\n\t *** "<<Search_key<<" is the Root Node."<<endl;
elseif(left_right==1)
cout<<"\n\n\n\t *** "<<Search_key<<" lies at the Left side of the Root Node ";
elseif(left_right==2)
cout<<"\n\n\n\t *** "<<Search_key<<" lies at the Right side of the Root Node ";
if(left_right)
cout<<"and at the depth level "<<depth<<endl;
}
cout<<"\n\n\n\t\t Pres any key to return to Menu. ";
getch( );
}
/*************************************************************************///--------------- delete_element_with_0_or_1_child( ) -----------------///*************************************************************************/void Tree::delete_element_with_0_or_1_child( )
{
Tree *Child;
if(Location->Left==NULL && Location->Right==NULL)
Child=NULL;
elseif(Location->Left!=NULL)
Child=Location->Left;
else
Child=Location->Right;
if(Parent!=NULL)
{
if(Location==Parent->Left)
Parent->Left=Child;
else
Parent->Right=Child;
}
else
Root_node=Child;
}
/*************************************************************************///------------------- delete_element_with_2_child( ) ------------------///*************************************************************************/void Tree::delete_element_with_2_child( )
{
Tree *Pointer=Location->Right;
Tree *Save=Location;
Tree *Sucessor;
Tree *Parent_sucessor;
while(Pointer->Left!=NULL)
{
Save=Pointer;
Pointer=Pointer->Left;
}
Sucessor=Pointer;
Parent_sucessor=Save;
Tree *temp_loc=Location;
Tree *temp_par=Parent;
Location=Sucessor;
Parent=Parent_sucessor;
delete_element_with_0_or_1_child( );
Location=temp_loc;
Parent=temp_par;
if(Parent!=NULL)
{
if(Location==Parent->Left)
Parent->Left=Sucessor;
else
Parent->Right=Sucessor;
}
else
Root_node=Sucessor;
Sucessor->Left=Location->Left;
Sucessor->Right=Location->Right;
}
/*************************************************************************///------------------------ delete_element( ) --------------------------///*************************************************************************/void Tree::delete_element(int delete_key)
{
search_element(delete_key);
if(Root_node==NULL)
cout<<"\n\n\n\t *** Error : Tree is empty. \n"<<endl;
elseif(Location==NULL)
cout<<"\n\n\n\t *** "<<delete_key<<" does not exists in the tree \n"<<endl;
else
{
if(Location->Right!=NULL && Location->Left!=NULL)
delete_element_with_2_child( );
else
delete_element_with_0_or_1_child( );
cout<<"\n\n\n\t *** "<<delete_key<<" is deleted from the Tree."<<endl;
cout<<"\n\n\n\t\t Pres any key to return to Menu. ";
getch( );
}
}
/*************************************************************************///------------------------ get_tree_depth( ) --------------------------///*************************************************************************/int Tree::get_tree_depth(Tree *root)
{
int depth=0;
int temp=-1;
find_tree_depth(root,temp,depth);
return depth;
}
/*************************************************************************///------------------------ get_tree_depth( ) --------------------------///*************************************************************************/void Tree::find_tree_depth(Tree *root,int temp,int& depth)
{
if(root==NULL)
{
}
else
{
temp++;
if(temp>depth)
depth=temp;
if(root->Left!=NULL)
find_tree_depth(root->Left,temp,depth);
if(root->Right!=NULL)
find_tree_depth(root->Right,temp,depth);
}
}
/*************************************************************************///-------------------------- show_working( ) --------------------------///*************************************************************************/void Tree::show_working( )
{
char Key=NULL;
do
{
clrscr( );
gotoxy(5,5);
cout<<"******** Implementation of Linked List as a Binary Search Tree ********"<<endl;
gotoxy(10,8);
cout<<"Select one of the listed operation :"<<endl;
gotoxy(15,10);
cout<<"- Press \'I\' to Insert a value"<<endl;
gotoxy(15,12);
cout<<"- Press \'D\' to Delete a value"<<endl;
gotoxy(15,14);
cout<<"- Press \'P\' to Print the values in In-Order"<<endl;
gotoxy(15,16);
cout<<"- Press \'Q\' to Print the values in Pre-Order"<<endl;
gotoxy(15,18);
cout<<"- Press \'R\' to Print the values in Post-Order"<<endl;
gotoxy(15,20);
cout<<"- Press \'T\' to Print the max. Tree Depth"<<endl;
gotoxy(15,22);
cout<<"- Press \'E\' to Exit"<<endl;
Input:
gotoxy(10,26);
cout<<" ";
gotoxy(10,26);
cout<<"Enter your Choice : ";
Key=getche( );
if(int(Key)==27 || Key=='e' || Key=='E')
break;
elseif(Key=='i' || Key=='I')
{
int item;
cout<<"\n\n\n\n\n\t Enter the value to insert into Tree : ";
cin>>item;
if(Root_node==NULL)
Root_node=insert_element(Root_node,item);
else
insert_element(Root_node,item);
}
elseif(Key=='d' || Key=='D')
{
int item;
cout<<"\n\n\n\n\n\t Enter the value to delete from Tree : ";
cin>>item;
delete_element(item);
}
elseif(Key=='s' || Key=='S')
{
int item;
cout<<"\n\n\n\n\n\t Enter the value to search from Tree : ";
cin>>item;
search_element(item);
}
elseif(Key=='p' || Key=='P')
{
if(Root_node!=NULL)
cout<<"\n\n\n\n\n\t Values of Tree in In-Order are : \n"<<endl;
else
cout<<"\n\n\n\n\n\t *** Nothing to show. "<<endl;
print_tree_in_in_order(Root_node);
cout<<"\n\n\n\t\t Pres any key to return to Menu. ";
getch( );
}
elseif(Key=='q' || Key=='Q')
{
if(Root_node!=NULL)
cout<<"\n\n\n\n\n\t Values of Tree in Pre-Order are : \n"<<endl;
else
cout<<"\n\n\n\n\n\t *** Nothing to show. "<<endl;
print_tree_in_pre_order(Root_node);
cout<<"\n\n\n\t\t Pres any key to return to Menu. ";
getch( );
}
elseif(Key=='r' || Key=='R')
{
if(Root_node!=NULL)
cout<<"\n\n\n\n\n\t Values of Tree in Post-Order are : \n"<<endl;
else
cout<<"\n\n\n\n\n\t *** Nothing to show. "<<endl;
print_tree_in_post_order(Root_node);
cout<<"\n\n\n\t\t Pres any key to return to Menu. ";
getch( );
}
elseif(Key=='t' || Key=='T')
{
if(Root_node!=NULL)
cout<<"\n\n\n\n\n\t Tree Depth = "<<get_tree_depth(Root_node)<<endl;
else
cout<<"\n\n\n\n\n\t *** Nothing to show. "<<endl;
cout<<"\n\n\n\t\t Pres any key to return to Menu. ";
getch( );
}
elsegoto Input;
}
while(1);
}
/*************************************************************************///---------------------------- main( ) --------------------------------///*************************************************************************/int main( )
{
Tree tree_obj;
tree_obj.show_working( );
return 0;
}