/*
In This Binary Search Tree Operations We Do
=> Insert Element
=> Delete Element
=> Find Maximum Element
=> Find Minimum Element
=> Search Element
*/
In This Binary Search Tree Operations We Do
=> Insert Element
=> Delete Element
=> Find Maximum Element
=> Find Minimum Element
=> Search Element
*/
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<math.h>
#include<time.h>
#define Max
20
struct Node
{
       int val;
       struct Node *lptr;
       struct Node *rptr;
};
int
SearchNode(struct Node* n, int x);
struct Node*
InsertIntoTree(struct Node* n, int x);
struct Node*
DeleteFromTree(struct Node* n, int x);
struct Node*
SearchMaxElement(struct Node *n);
struct Node*
SearchMinElement(struct Node *n);
void InOrderTraversal(struct
Node* n);
void
PostOrderTraversal(struct Node* n);
void
PreOrderTraversal(struct Node* n);
void main()
{
       struct Node *n=NULL;
       struct Node *Min_Max_Value;
       int i,j,Temp_Val,Flag=1;
       char ch;
       float Traverse_Time;
       clock_t first,second;
       do
       {
        printf("\nMenu....");
        printf("\n1. Insert
Element \n2. Delete Element \n3. Find Maximum \n4. Find Minimum \n5. Search
Element");
        printf("\n6. InOrder
Traversal \n7. PreOrder Traversal \n8. Post Order Traversal \n9. Exit");
        printf("\nEnter
Choice : ");
        scanf("%d",&ch);
        clrscr();
        switch(ch)
        {
              case 1:  printf("\nEnter Element to be Inserted :
");
                           scanf("%d",&Temp_Val);
                           n
= InsertIntoTree(n,Temp_Val);
                            printf("\nElement
Inserted");
                            break;
               case 2:
first = clock();
                           printf("\nEnter
Element to be deleted : ");
                           scanf("%d",&Temp_Val);
                           n
= DeleteFromTree(n,Temp_Val);
                           InOrderTraversal(n);
                           printf("\nElement
Deleted");
                           second
= clock();
                           Traverse_Time
= (second-first)/CLOCKS_PER_SEC;
                           printf("\nTime
To Delete Element is %f",Traverse_Time);
                           break;
                case 3:
first = clock();
                            Min_Max_Value
= SearchMaxElement(n);
                            printf("\nMaximum
Element in Tree : %d",Min_Max_Value->val);
                            second
= clock();
                            Traverse_Time
= (second-first)/CLOCKS_PER_SEC;
                            printf("\nTime
To Find Max Element is %f",Traverse_Time);
                            break;
                 case 4:
first = clock();
                             Min_Max_Value
= SearchMinElement(n);
                             printf("\nMinimum
Element in Tree : %d",Min_Max_Value->val);
                             second
= clock();
                             Traverse_Time
= (second-first)/CLOCKS_PER_SEC;
                             printf("\nTime
To Find Min Element is %f",Traverse_Time);
                             break;
                 case 5:
first = clock();
                            printf("\nEnter
Element to search : ");
                            scanf("%d",&Temp_Val);
                            Flag
= SearchNode(n,Temp_Val);
                            if(Flag!=0)
                            printf("\nElement
Not Found");
                           else
                           printf("\nElement
Found");
                           second
= clock();
                           Traverse_Time
= (second-first)/CLOCKS_PER_SEC;
                           printf("\nTime
To Search Element is %f",Traverse_Time);
                           break;
                case 6:
first = clock();
                            printf("\nIn
Order Traversal...");
                            InOrderTraversal(n);
                            second
= clock();
                            Traverse_Time
= (second-first)/CLOCKS_PER_SEC;
                             printf("\nTime
To InOrder Traversal is %f",Traverse_Time);
                             break;
                  case 7:
first = clock();
                             printf("\nPre
Order Traversal...");
                             PreOrderTraversal(n);
                             second
= clock();
                             Traverse_Time
= (second-first)/CLOCKS_PER_SEC;
                             printf("\nTime
To PreOrder Traversal is %f",Traverse_Time);
                             break;
                 case 8:
first = clock();
                             printf("\nPost
Order Traversal...");
                             PostOrderTraversal(n);
                             second
= clock();
                             Traverse_Time
= (second-first)/CLOCKS_PER_SEC;
                             printf("\nTime
To PostOrder Traversal is %f",Traverse_Time);
                             break;
                            default:
exit(0);
                       }
                       printf("\nDo You
want to Continue [y/n]...");
       }while(getchar()=='Y' || getchar()=='y');
       getch();
}
int
SearchNode(struct Node *n, int x)
{
       if (n->val==x)
           return 0;
       else if(n->lptr==NULL &&
n->rptr==NULL)
           return 1;
       else if(x < n->val)
              return
SearchNode(n->lptr,x);
       else if(x > n->val)
              return
SearchNode(n->rptr,x);
}
struct Node
*InsertIntoTree(struct Node *n, int x)
{
       struct Node *newNode;
       newNode = (struct
Node*)malloc(sizeof(struct Node));
       newNode->val = x;
       newNode->lptr = newNode->rptr =
NULL;
       if(n==NULL)
       {
                       n = newNode;
                       n->lptr=NULL;
                       n->rptr=NULL;
       }
       else
       {
                       if(x < n->val)
                                       n->lptr
= InsertIntoTree(n->lptr,x);
                       else
                                       n->rptr
= InsertIntoTree(n->rptr,x);
       }
       return n;
}
struct Node
*DeleteFromTree(struct Node *n, int x)
{
       if(n==NULL)
                       printf("\nNo any
element exist in Tree");
       else if(x < n->val)
                       n->lptr =
DeleteFromTree(n->lptr,x);
       else if(x > n->val)
                       n->rptr =
DeleteFromTree(n->rptr,x);
       else
       {
                       if(n->lptr !=NULL
&& n->rptr != NULL)
                       {
                                       struct
Node *Max_Ele;
                                       Max_Ele =
SearchMaxElement(n->lptr);
                                       n->val
= Max_Ele->val;
                                       n->lptr
= DeleteFromTree(n->lptr,Max_Ele->val);
                       }
                       else
                       {
                                       struct
Node *Temp;
                                       Temp = n;
                                       if(n->lptr
== NULL)
                                                       n
= n->rptr;
                                       else
                                                       n
= n->lptr;
                                       free(Temp);
                       }
       }
       return (n);
}
struct Node
*SearchMaxElement(struct Node *n)
{
       if (n==NULL || n->rptr == NULL)
                       return n;
       else
                       return
SearchMaxElement(n->rptr);
}
struct Node
*SearchMinElement(struct Node *n)
{
       if(n==NULL || n->lptr == NULL)
                       return n;
       else
                       return SearchMinElement(n->lptr);
}
void
InOrderTraversal(struct Node *n)
{
       struct Node *Cur, *Pre;
       if(n==NULL)
                       return;
       Cur = n;
       while(Cur != NULL)
       {
                       if(Cur->lptr == NULL)
                       {
                                       printf("\t%d",Cur->val);
                                       Cur=
Cur->rptr;
                       }
                       else
                       {
                                       Pre =
Cur->lptr;
                                       while(Pre->rptr
!=NULL && Pre->rptr != Cur)
                                                       Pre
= Pre->rptr;
                                       if
(Pre->rptr == NULL)
                                       {
                                                       Pre->rptr
= Cur;
                                                       Cur
= Cur->lptr;
                                       }
                                       else
                                       {
                                                       Pre->rptr
= NULL;
                                                       printf("\t%d",Cur->val);
                                                       Cur
= Cur->rptr;
                                       }
                       }
       }
}
void PreOrderTraversal(struct
Node* n)
{
       if(n!=NULL)
       {
                       printf("\t%d",n->val);
                       PreOrderTraversal(n->lptr);
                       PreOrderTraversal(n->rptr);
       }
}
void
PostOrderTraversal(struct Node *n)
{
       if(n!=NULL)
       {
                       PostOrderTraversal(n->lptr);
                       PostOrderTraversal(n->rptr);
                       printf("\t%d",n->val);
       }
}
