You are on page 1of 9

Maaz Shaheen

20MDBCS065
Lab task:
Code:
#include<iostream>
#include<conio.h>

using namespace std;

// tree node definition


struct tree_node
{
int element;
tree_node *left;
tree_node *right;
};

// function that returns a pointer to the node containing the value to be found
tree_node* find( int x, tree_node* T ) {
if( T == NULL )
return NULL;
if( x < T->element )
return( find( x, T->left ) );
else{

if( x > T->element )


return( find( x, T->right ) );
else
return T;
}
}

// Fucntin that deletes the entire binary tree


tree_node* MakeEmpty(tree_node* T){
if (T != NULL) {
MakeEmpty(T->left);
MakeEmpty(T->right);
delete(T);
}
return NULL;
}

// function that returns pointer to the minimum value in the tree. it is recursive
tree_node* find_min(tree_node* T ) {
if( T == NULL )
return NULL;
else{

if( T->left == NULL )


return( T );
else
return( find_min ( T->left ) );
}
}

//functin that reutrns pointer to the max value in the tree. it is non recrusive
tree_node* find_max(tree_node* T ) {
if( T != NULL )
while( T->right != NULL )
T = T->right;
return T;
}

tree_node* insert( int x, tree_node* T ) {


if( T == NULL ) { /* Create and return a one-node tree */
T = new tree_node;
if( T == NULL )
cout<<"Out of space!!!";
else {
T->element = x;
T->left = T->right = NULL;
}
}
else{
if( x < T->element )
T->left = insert( x, T->left );
else{
if( x > T->element )
T->right = insert( x, T->right );
/* else x is in the tree already. We'll do nothing */
}
}
return T; /* Don't forget this line!! */
}

//Task for both sections. Complete the following function.


tree_node* Delete( int x, tree_node* T ) {

tree_node* temp, *child;


if(T==NULL){
cout<<"Element is not found"<<endl;}
else if(x <T->element ){
T->left= Delete(x, T->left);
}
else if(x>T->element){
T->right= Delete(x, T->right);
}

else
if(T->left && T->right){
temp=find_min(T->right);
int xmin=temp->element;
T->element=xmin;
T->right= Delete(xmin, T->right);
}
else{
temp=T;
if( T->left==NULL)
child=T->right;
if(T->right==NULL)
child=T->left;
delete(temp);
return child;
}
return T;
}

// inorder traversal of tree


void inorder(tree_node *T){
if(T== NULL)
return;

inorder(T->left);
cout<<"\t"<<T->element;
inorder(T->right);
}

//preorder traversal
void preorder(tree_node *T){
if(T== NULL)
return;
cout<<"\t"<<T->element;
preorder(T->left);
preorder(T->right);
}

//postorder traversal
void postorder(tree_node *T){
if(T== NULL)
return;
postorder(T->left);
postorder(T->right);
cout<<"\t"<<T->element;
}

int main(){
tree_node* root = NULL;

//add some value to the tree


root = insert(5,root);
root = insert(12,root);
root = insert(25,root);
root = insert(2,root);
root = insert(4,root);

root = insert(15,root);
root = insert(17,root);
root = insert(35,root);
root = insert(1,root);
root = insert(14,root);

cout<<endl<<endl;
cout<<"In-order traversal :"<<endl;
inorder(root);

cout<<endl<<endl;
cout<<"Pre-order traversal :"<<endl;
preorder(root);

cout<<endl<<endl;
cout<<"Post-order traversal :"<<endl;
postorder(root);

cout<<endl<<endl;
cout<<"Deleting :"<<5<<endl;
Delete(5,root);

cout<<endl<<endl;
cout<<"Pre-order traversal :"<<endl;
preorder(root);

return 0;
}

You might also like