Answer:
See explaination
Explanation:
include<bits/stdc++.h>
using namespace std;
typedef struct Node
{
int data;
struct Node *left,*right;
}Node;
bool search(Node *root,int data)
{
if(root==NULL)
return false;
if(root->data==data)
return true;
queue<Node*> q;
q.push(root);
while(!q.empty())
{
Node *temp=q.front();
q.pop();
if(temp->data==data)
return true;
if(temp->left)
q.push(temp->left);
if(temp->right)
q.push(temp->right);
}
return false;
}
Node *insert(Node *root,int data)
{
if(root==NULL)
{
Node *temp=new Node();
temp->data=data;
temp->left=NULL;
temp->right=NULL;
return temp;
}
if(data < root->data)
root->left=insert(root->left,data);
if(data>root->data)
root->right=insert(root->right,data);
return root;
}
Node *get_smallest_element_right_subtree(Node *root)
{
while(root && root->left!=NULL)
root=root->left;
return root;
}
Node *delete_node(Node *root,int data)
{
if(root==NULL)
return root;
if(data < root->data)
root->left=delete_node(root->left,data);
else if(data > root->data)
root->right=delete_node(root->right,data);
else
{
if(root->left==NULL) //If right only presents means - delete the curr node and return right node
{
Node *temp=root->right;
free(root);
return temp;
}
else if(root->right==NULL) //If left only presents means - delete the curr node and return let node
{
Node *temp=root->left;
free(root);
return temp;
}
else
{
Node *temp=get_smallest_element_right_subtree(root->right);
root->data=temp->data;
root->right=delete_node(root->right,temp->data);
}
return root;
}
}
void inorder(Node *root)
{
if(root!=NULL)
{
inorder(root->left);
cout<<root->data<<" ";
inorder(root->right);
}
}
void postorder(Node *root)
{
if(root!=NULL)
{
inorder(root->left);
inorder(root->right);
cout<<root->data<<" ";
}
}
void preorder(Node *root)
{
if(root!=NULL)
{
cout<<root->data<<" ";
inorder(root->left);
inorder(root->right);
}
}
int main()
{
fstream f;
string filename;
cout<<"\n\n1 - Input through File ";
cout<<"\n\n2 - Input through your Hand";
int h;
cout<<"\n\n\nEnter Your Choice : ";
cin>>h;
Node *root=NULL; // Tree Declaration
if(h==1)
{
cout<<"\n\nEnter the Input File Name : ";
cin>>filename;
f.open(filename.c_str());
if(!f)
cout<<"\n\nError in Opening a file !";
else
{
cout<<"\n\nFile is Being Read ........";
string num;
int value;
int node=0;
while(f>> num)
{
value=stoi(num);
root=insert(root,value);
node++;
}
cout<<"\n\nTree has been successfully created with : "<<node<<" Nodes"<<endl;
}
}
if(h==2)
{
int y;
cout<<"\n\nEnter the Total No of Input :";
cin>>y;
int i=1,g;
while(i!=y+1)
{
cout<<"\n\nEnter Input "<<i<<" : ";
cin>>g;
root=insert(root,g);
i++;
}
cout<<"\n\nTree has been successfully created with : "<<y<<" Nodes"<<endl;
}
if(h>=3)
{
cout<<"\n\nInvalid Choice !!! ";
return 0;
}
int n=0;
while(n!=6)
{
cout<<"\n\n\n1 - Insert Element";
cout<<"\n\n2 - Remove Element";
cout<<"\n\n3 - Inorder (LNR) Display ";
cout<<"\n\n4 - Pre (NLR) Order Display";
cout<<"\n\n5 - Post (LRN) Order Display";
cout<<"\n\n6 - Quit";
cout<<"\n\nEnter Your Choice : ";
cin>>n;
switch(n)
{
case 1:
{
int k;
cout<<"\n\nEnter Element to insert : ";cin>>k;
root=insert(root,k);
cout<<"\n\nElement Sucessfully Inserted !!!!!";
break;
}
case 2:
{
int k;
cout<<"\n\nEnter Element to Remove : ";
cin>>k;
if(search(root,k))
{
root=delete_node(root,k);
cout<<"\n\nValue Successfully Deleted !!!";
}
else
cout<<"\n\n!!!!!!!!!!!!!!!!!!!! No Such Element !!!!!!!!!!!!!!!!!!!!!!";
break;
}
case 3:
{
cout<<"\n\nThe Elements (LNR) are : ";
inorder(root);
break;
}
case 4:
{
cout<<"\n\nThe Elements (NLR) are : ";
preorder(root);
break;
}
case 5:
{
cout<<"\n\nThe Elements (LRN) are : ";
postorder(root);
break;
}
case 6:
{
break;
}
}
}
cout<<"\n\nBye!!!! See You !!!"<<endl;