Print Friendly and PDF
# include < conio.h > 
# include < process.h > 
# include < iostream.h > 
# include < alloc.h > 
struct node 
{ 
int ele; 
node *left; 
node *right; 
}; 
typedef struct node *nodeptr; 
class stack 
{ 
private: 
struct snode 
{ 
nodeptr ele; 
snode *next; 
}; 
snode *top; 
public: 
stack() 
{ 
top=NULL; 
} 
void push(nodeptr p) 
{ 
snode *temp; 
temp = new snode; 
temp->ele = p; 
temp->next = top; 
top=temp; 
} 
void pop() 
{ 
if (top != NULL) 
{ 
nodeptr t; 
snode *temp; 
temp = top; 
top=temp->next; 
delete temp; 
} 
} 
nodeptr topele() 
{ 
if (top !=NULL) 
return top->ele; 
else 
return NULL; 
} 
int isempty() 
{ 
return ((top == NULL) ? 1 : 0); 
} 
}; 
class bstree 
{ 
public: 
void insert(int,nodeptr &); 
void del(int,nodeptr &); 
int deletemin(nodeptr &); 
void find(int,nodeptr &); 
nodeptr findmin(nodeptr); 
nodeptr findmax(nodeptr); 
void copy(nodeptr &,nodeptr &); 
void makeempty(nodeptr &); 
nodeptr nodecopy(nodeptr &); 
void preorder(nodeptr); 
void inorder(nodeptr); 
void postorder(nodeptr); 
void preordernr(nodeptr); 
void inordernr(nodeptr); 
void postordernr(nodeptr); 
void leftchild(int,nodeptr &); 
void rightchild(int,nodeptr &); 
}; 
void bstree::insert(int x,nodeptr &p) 
{ 
if (p==NULL) 
{ 
p = new node; 
p->ele=x; 
p->left=NULL; 
p->right=NULL; 
} 
else 
{ 
if (x < p->ele) 
insert(x,p->left); 
else if (x>p->ele) 
insert(x,p->right); 
else 
cout<<"Element already Exits !"; 
} 
} 
void bstree:: del(int x,nodeptr &p) 
{ 
nodeptr d; 
if (p==NULL) 
cout<<"Element not found "; 
else if (x < p->ele) 
del(x,p->left); 
else if (x > p->ele) 
del(x,p->right); 
else if ((p->left == NULL) && (p->right ==NULL)) 
{ 
d=p; 
free(d); 
p=NULL; 
} 
else if (p->left == NULL) 
{ 
d=p; 
free(d); 
p=p->right; 
} 
else if (p->right ==NULL) 
{ 
d=p; 
p=p->left; 
free(d); 
}
else 
p->ele=deletemin(p->right); 
} 
int bstree::deletemin(nodeptr &p) 
{ 
int c; 
if (p->left == NULL) 
{ 
c=p->ele; 
p=p->right; 
return c; 
} 
else 
c=deletemin(p->left); 
return c; 
} 
void bstree::copy(nodeptr &p,nodeptr &p1) 
{ 
makeempty(p1); 
p1=nodecopy(p); 
} 
void bstree::makeempty(nodeptr &p) 
{ 
nodeptr d; 
if (p!=NULL) 
{ 
makeempty(p->left); 
makeempty(p->right); 
d=p; 
free(d); 
p=NULL; 
} 
} 
nodeptr bstree::nodecopy(nodeptr &p) 
{ 
nodeptr temp; 
if (p == NULL) 
return p; 
else 
{ 
temp = new node; 
temp->ele=p->ele; 
temp->left = nodecopy(p->left); 
temp->right = nodecopy(p->right); 
return temp; 
} 
} 
nodeptr bstree::findmin(nodeptr p) 
{ 
if (p==NULL) 
{ 
cout<<"Tree is empty !"; 
return p; 
} 
else 
{ 
while (p->left !=NULL) 
p=p->left; 
return p; 
} 
} 
nodeptr bstree::findmax(nodeptr p) 
{ 
if (p==NULL) 
{ 
cout<<"Tree is empty !"; 
return p; 
} 
else 
{ 
while (p->right !=NULL) 
p=p->right; 
return p; 
} 
} 
void bstree::find(int x,nodeptr &p) 
{
if (p==NULL) 
cout<<"Element not found !"; 
else 
{ 
if (x < p->ele) 
find(x,p->left); 
else if ( x> p->ele) 
find(x,p->right); 
else 
cout<<"Element Found !"; 
} 
} 
void bstree::preorder(nodeptr p) 
{ 
if (p!=NULL) 
{ 
cout<< p->ele<<"-->"; 
preorder(p->left); 
preorder(p->right); 
} 
} 
void bstree::inorder(nodeptr p) 
{ 
if (p!=NULL) 
{ 
inorder(p->left); 
cout<< p->ele<<"-->"; 
inorder(p->right);
} 
} 
void bstree::postorder(nodeptr p) 
{ 
if (p!=NULL) 
{ 
postorder(p->left); 
postorder(p->right); 
cout<< p->ele<<"-->"; 
}

} 
void bstree::preordernr(nodeptr p) 
{ 
stack s; 
while (1) 
{ 
if (p != NULL) 
{ 
cout<< p->ele<<"-->"; 
s.push(p); 
p=p->left; 
} 
else if (s.isempty()) 
{ 
cout<<"Stack is empty"; 
return; 
} 
else 
{ 
nodeptr t; 
t=s.topele(); 
p=t->right; 
s.pop(); 
} 
} 
} 
void bstree::inordernr(nodeptr p) 
{ 
stack s; 
while (1) 
{ 
if (p != NULL) 
{ 
s.push(p); 
p=p->left; 
} 
else 
{ 
if (s.isempty()) 
{ 
cout<<"Stack is empty"; 
return; 
} 
else 
{ 
p=s.topele();
cout<< p->ele<<"-->"; 
} 
s.pop(); 
p=p->right; 
} 
} 
} 
void bstree::postordernr(nodeptr p) 
{ 
stack s; 
while (1) 
{ 
if (p != NULL) 
{ 
s.push(p); 
p=p->left; 
} 
else 
{ 
if (s.isempty()) 
{ 
cout<<"Stack is empty"; 
return; 
} 
else 
if (s.topele()->right == NULL) 
{ 
p=s.topele(); 
s.pop(); 
cout<< p->ele<<"-->"; 
if (p==s.topele()->right) 
{ 
cout<< s.topele()->ele<<"-->"; 
s.pop(); 
} 
} 
if (!s.isempty()) 
p=s.topele()->right; 
else 
p=NULL; 
} 
} 
} 
void bstree::leftchild(int q,nodeptr &p) 
{ 
if (p==NULL) 
cout<<"The node does not exists "; 
else 
if (q < p->ele ) 
leftchild(q,p->left); 
else 
if (q > p->ele) 
leftchild(q,p->right); 
else 
if (q == p->ele) 
{ 
if (p->left != NULL) 
cout<<"Left child of "<< q<<"is "<< p->left->ele; 
else 
cout<<"No Left child !"; 
} 
} 
void bstree::rightchild(int q,nodeptr &p) 
{ 
if (p==NULL) 
cout<<"The node does not exists "; 
else 
if (q < p->ele ) 
rightchild(q,p->left); 
else 
if (q > p->ele) 
rightchild(q,p->right); 
else 
if (q == p->ele) 
{ 
if (p->right != NULL) 
cout<<"Right child of "<< q<<"is "<< p->right->ele; 
else 
cout<<"No Right Child !"; 
} 
} 
int main() 
{ 
int ch,x,leftele,rightele; 
bstree bst; 
char c='y'; 
nodeptr root,root1,min,max; 
root=NULL; 
root1=NULL; 
do 
{ 
// system("clear");
clrscr(); 
cout<<"Binary Search Tree "; 
cout<<"-------------------------"; 
cout<<"1.Insertion 
2.Deletion 
3.NodeCopy"; 
cout<<"4.Find 
5.Findmax 
6.Findmin"; 
cout<<"7.Preorder 
8.Inorder 
9.Postorder"; 
cout<<"10.Leftchild 
11.Rightchild 
0.Exit"; 
cout<<"Enter your choice :"; 
cin>>ch; 
switch(ch) 
{ 
case 1: 
cout<<"1.Insertion"; 
cout<<"Enter the new element to get inserted :"; 
cin>>x; 
bst.insert(x,root); 
cout<<"Inorder traversal is :"; 
bst.inorder(root); 
break; 
case 2: 
cout<<"2.Deletion"; 
cout<<"Enter the element to get deleted :"; 
cin>>x; 
bst.del(x,root); 
bst.inorder(root); 
break; 
case 3: 
cout<<"3.Nodecopy"; 
bst.copy(root,root1); 
cout<<"The new tree is :"; 
bst.inorder(root1); 
break; 
case 4: 
cout<<"4.Find"; 
cout<<"Enter the element to be searched :"; 
cin>>x; 
bst.find(x,root); 
break; 
case 5: 
cout<<"5.Findmax"; 
if (root == NULL) 
cout<<"Tree is empty"; 
else 
{ 
max=bst.findmax(root); 
cout<<"Largest element is : "<< max->ele<< endl; 
} 
break; 
case 6: 
cout<<"6.Findmin"; 
if (root == NULL) 
cout<<"Tree is empty"; 
else 
{ 
min=bst.findmin(root); 
cout<<"Smallest element is : "<< min->ele<< endl; 
} 
break; 
case 7: 
cout<<"7.Preorder"; 
if (root==NULL) 
cout<<"Tree is empty"; 
else 
{ 
cout<<"Preorder traversal (Non-Recursive) is :"; 
bst.preordernr(root); 
cout<<"Preorder traversal (Recursive) is :"; 
bst.preorder(root); 
} 
break; 
case 8: 
cout<<"8.Inorder"; 
if (root==NULL) 
cout<<"Tree is empty"; 
else 
{ 
cout<<"Inorder traversal (Non-Recursive) is :"; 
bst.inordernr(root); 
cout<<"Inorder traversal (Recursive) is :"; 
bst.inorder(root); 
} 
break; 
case 9: 
cout<<"9.Postorder"; 
if (root==NULL) 
cout<<"Tree is empty"; 
else 
{ 
cout<<"Postorder traversal (Non-Recursive) is :"; 
bst.postordernr(root); 
cout<<"Postorder traversal (Recursive) is :"; 
bst.postorder(root); 
} 
break; 
case 10: 
cout<<"10.Finding the left Child "; 
if (root==NULL) 
cout<<"Tree is empty"; 
else 
{ 
cout<<"Enter the node for which the left child is to be found :"; 
cin>>leftele; 
bst.leftchild(leftele,root); 
} 
break; 
case 11: 
cout<<"11.Finding the Right Child "; 
if (root==NULL) 
cout<<"Tree is empty"; 
else 
{ 
cout<<"Enter the node for which the Right child is to be found :"; 
cin>>rightele; 
bst.rightchild(rightele,root); 
} 
break; 
case 0: 
exit(0); 
} 
cout<<"Continue (y/n) ?"; 
cin>>c; 
}
while (c=='y' || c == 'Y'); 
return 0; 
}
zubairsaif

Zubair saif

A passionate writer who loves to write on new technology and programming

Post A Comment:

0 comments: