Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Implementation of BST: Partially completed C++ implementation of BST is given. I

ID: 3850206 • Letter: I

Question

Implementation of BST:

Partially completed C++ implementation of BST is given. It implements to the INSERT and INORDER traversal. You need to implement the following BST algorithms discussed in the book. Each algorithm should be implemented as a separate method. You are free to change the tree node structure given while implementing these algorithms.

a) Insert

b) Post Order Traversal

c) Pre Order Traversal

d) Find Max

e) Remove Max

f) Successor (see slides for the algorithm)

g) Delete

Program should have a similar interface given below and the user can select the suitable option to perform the desired operation.

#include <iostream>

#include <cstdlib>

using namespace std;

class BinarySearchTree

{

private:

class node

{

public:

node* left;

node* right;

int key;

string data;

};

public:

node* root;

BinarySearchTree()

{

root = NULL;

}

bool isEmpty() const { return root == NULL; }

void INORDER_TREE_WALK(node*);

void TREE_INSERT(int );

};

void BinarySearchTree::TREE_INSERT(int d)

{

// This implements the algorithm in page 261 of the textbook

node* z = new node();

z->key = d;

z->left = NULL;

z->right = NULL;

node* y = NULL;

node* x = root;

node* parent = NULL;

while (x != NULL)

{

y = x;

if (z->key < x->key)

x = x->left;

else

x = x->right;

}

parent = y;

if (y == NULL)

root = z;

else if (z->key < y->key)

y->left = z;

else

y->right = z;

}

void BinarySearchTree::INORDER_TREE_WALK(node* x)

{

if (x != NULL)

{

if (x->left) INORDER_TREE_WALK(x->left);

cout << " " << x->key << " ";

if (x->right) INORDER_TREE_WALK(x->right);

}

}

int main()

{

BinarySearchTree bst;

int choice, key;

while (true)

{

cout << endl << endl;

cout << " Binary Search Tree Example " << endl;

cout << " ----------------------------- " << endl;

cout << " 1. Insertion " << endl;

cout << " 2. In-Order Traversal " << endl;

cout << " 3. Exit " << endl;

cout << " Enter your choice : ";

cin >> choice;

switch (choice)

{

case 1: cout << " Enter key (int value) to be inserted : ";

cin >> key;

bst.TREE_INSERT(key);

break;

case 2: cout << endl;

cout << " In-Order Traversal " << endl;

cout << " -------------------" << endl;

bst.INORDER_TREE_WALK(bst.root);

break;

case 3: system("pause");

return 0;

break;

default:

cout << "Invalid choice";

}

}

}

C:Windows system321cmd.exe CEA. Binary Search Tree Example 1 Insert a Node 2. Pre-order Traversa 3 Post-order Traversal 4. In order Traversal 5 Find Max 6. Remove Max Successor 8 Delete a Node 8 Exit Enter your choice

Explanation / Answer

# include <iostream>

# include <cstdlib>

using namespace std;

struct node

{

    int info;

   struct node *left;

    struct node *right;

}*root;

class BST

{

    public:

       void find(int, node **, node **);   

        void insert(int);

        void del(int);

        void case_a(node *,node *);

        void case_b(node *,node *);

        void case_c(node *,node *);

        void preorder(node *);

        void inorder(node *);

        void postorder(node *);

        void display(node *, int);

        BST()

        {

            root = NULL;

        }

}

int main()

{

    int choice, num;

    BST bst;

    node *temp;

    while (1)

    {

        cout<<"-----------------"<<endl;

       cout<<"Operations on BST"<<endl;

        cout<<"-----------------"<<endl;

        cout<<"1.Insert Element "<<endl;

        cout<<"2.Delete Element "<<endl;

        cout<<"3.Inorder Traversal"<<endl;

        cout<<"4.Preorder Traversal"<<endl;

        cout<<"5.Postorder Traversal"<<endl;

        cout<<"6.Display"<<endl;

        cout<<"7.Quit"<<endl;

        cout<<"Enter your choice : ";

        cin>>choice;

        switch(choice)

        {

        case 1:

            temp = new node;

            cout<<"Enter the number to be inserted : ";

                    cin>>temp->info;

            bst.insert(root, temp);

        case 2:

            if (root == NULL)

            {

                cout<<"Tree is empty, nothing to delete"<<endl;

                continue;

            }

            cout<<"Enter the number to be deleted : ";

            cin>>num;

            bst.del(num);

            break;

        case 3:

            cout<<"Inorder Traversal of BST:"<<endl;

            bst.inorder(root);

            cout<<endl;

            break;

                case 4:

            cout<<"Preorder Traversal of BST:"<<endl;

            bst.preorder(root);

            cout<<endl;

            break;

        case 5:

            cout<<"Postorder Traversal of BST:"<<endl;

            bst.postorder(root);

            cout<<endl;

            break;

        case 6:

            cout<<"Display BST:"<<endl;

            bst.display(root,1);

            cout<<endl;

            break;

        case 7:

            exit(1);

        default:

            cout<<"Wrong choice"<<endl;

        }

    }

}

void BST::find(int item, node **par, node **loc)

{

    node *ptr, *ptrsave;

    if (root == NULL)

    {

        *loc = NULL;

        *par = NULL;

        return;

    }

    if (item == root->info)

    {

        *loc = root;

        *par = NULL;

        return;

    }

    if (item < root->info)

        ptr = root->left;

    else

        ptr = root->right;

    ptrsave = root;

    while (ptr != NULL)

    {

        if (item == ptr->info)

        {

            *loc = ptr;

            *par = ptrsave;

            return;

        }

        ptrsave = ptr;

        if (item < ptr->info)

            ptr = ptr->left;

                else

                    ptr = ptr->right;

    }

    *loc = NULL;

    *par = ptrsave;

}

void BST::insert(node *tree, node *newnode)

{

    if (root == NULL)

    {

        root = new node;

        root->info = newnode->info;

        root->left = NULL;

        root->right = NULL;

        cout<<"Root Node is Added"<<endl;

        return;

    }

    if (tree->info == newnode->info)

    {

        cout<<"Element already in the tree"<<endl;

        return;

    }

    if (tree->info > newnode->info)

    {

        if (tree->left != NULL)

        {

            insert(tree->left, newnode);        

                }

                else

                {

            tree->left = newnode;

            (tree->left)->left = NULL;

            (tree->left)->right = NULL;

            cout<<"Node Added To Left"<<endl;

            return;

        }

   }

    else

    {

        if (tree->right != NULL)

        {

            insert(tree->right, newnode);

        }

        else

        {

            tree->right = newnode;

            (tree->right)->left = NULL;

            (tree->right)->right = NULL;

            cout<<"Node Added To Right"<<endl;

            return;

        }    

    }

}

void BST::del(int item)

{

    node *parent, *location;

   if (root == NULL)

    {

        cout<<"Tree empty"<<endl;

        return;

    }

    find(item, &parent, &location);

    if (location == NULL)

    {

        cout<<"Item not present in tree"<<endl;

   return;

    }

    if (location->left == NULL && location->right == NULL)

        case_a(parent, location);

    if (location->left != NULL && location->right == NULL)

        case_b(parent, location);

    if (location->left == NULL && location->right != NULL)

        case_b(parent, location);

    if (location->left != NULL && location->right != NULL)

        case_c(parent, location);

    free(location);

}

void BST::case_a(node *par, node *loc )

{

    if (par == NULL)

    {

        root = NULL;

    }

    else

    {

        if (loc == par->left)

            par->left = NULL;

        else

            par->right = NULL;

void BST::case_b(node *par, node *loc)

{

    node *child;

    if (loc->left != NULL)

        child = loc->left;

    else

        child = loc->right;

    if (par == NULL)

    {

        root = child;

    }

    else

    {

        if (loc == par->left)

            par->left = child;

        else

            par->right = child;

    }

}

void BST::case_c(node *par, node *loc)

{

    node *ptr, *ptrsave, *suc, *parsuc;

    ptrsave = loc;

    ptr = loc->right;

    while (ptr->left != NULL)

    {

        ptrsave = ptr;

        ptr = ptr->left;

    }

    suc = ptr;

    parsuc = ptrsave;

    if (suc->left == NULL && suc->right == NULL)

        case_a(parsuc, suc);

    else

        case_b(parsuc, suc);

    if (par == NULL)

    {

        root = suc;

    }

    else

    {

        if (loc == par->left)

            par->left = suc;

        else

            par->right = suc;

    }

    suc->left = loc->left;

    suc->right = loc->right;

}

void BST::preorder(node *ptr)

{

    if (root == NULL)

    {

        cout<<"Tree is empty"<<endl;

        return;

    }

    if (ptr != NULL)

    {

        cout<<ptr->info<<" ";

        preorder(ptr->left);

        preorder(ptr->right);

    }

}

void BST::inorder(node *ptr)

{

    if (root == NULL)

    {

        cout<<"Tree is empty"<<endl;

        return;

    }

    if (ptr != NULL)

    {

        inorder(ptr->left);

        cout<<ptr->info<<" ";

        inorder(ptr->right);

    }

void BST::postorder(node *ptr)

{

    if (root == NULL)

    {

        cout<<"Tree is empty"<<endl;

        return;

    }

    if (ptr != NULL)

    {

        postorder(ptr->left);

        postorder(ptr->right);

        cout<<ptr->info<<" ";

    }

}

void BST::display(node *ptr, int level)

{

    int i;

    if (ptr != NULL)

    {

        display(ptr->right, level+1);

        cout<<endl;

        if (ptr == root)

            cout<<"Root->: ";

        else

        {

            for (i = 0;i < level;i++)

                cout<<"       ";

                }

        cout<<ptr->info;

        display(ptr->left, level+1);

    }