In: Computer Science
In C++, dealing with Binary Search trees. Implement search, insert, removeLeaf, and removeNodeWithOneChild methods in BST.h. BST.h code below
#include <iostream>
#include "BSTNode.h"
using namespace std;
#ifndef BST_H_
#define BST_H_
class BST {
public:
        BSTNode *root;
        int size;
        BST() {
                root = NULL;
                size = 0;
        }
        ~BST() {
                if (root != NULL)
                        deepClean(root);
        }
        BSTNode *search(int key) { // complete this method
        }
        BSTNode *insert(int val) { // complete this method
        }
        bool remove(int val) { // complete this method
        }
private:
        void removeLeaf(BSTNode *leaf) { // complete this method
        }
        void removeNodeWithOneChild(BSTNode *node) { // complete this method
        }
        static BSTNode *findMin(BSTNode *node) {
                if (NULL == node)
                        return NULL;
                while (node->left != NULL) {
                        node = node->left;
                }
                return node;
        }
        static BSTNode *findMax(BSTNode *node) {
                if (NULL == node)
                        return NULL;
                while (node->right != NULL) {
                        node = node->right;
                }
                return node;
        }
        void print(BSTNode *node) {
                if (NULL != node) {
                        node->toString();
                        cout << " ";
                        print(node->left);
                        print(node->right);
                }
        }
        static int getHeight(BSTNode *node) {
                if (node == NULL)
                        return 0;
                else
                        return 1 + max(getHeight(node->left), getHeight(node->right));
        }
    
    static void deepClean(BSTNode *node) {
        if (node->left != NULL)
            deepClean(node->left);
        if (node->right != NULL)
            deepClean(node->right);
        delete node;
    }
public:
        int getTreeHeight() {
                return getHeight(root);
        }
        void print() {
                print(root);
        }
        int getSize() {
                return size;
        }
};
#endif
This is the expected output
****************** Test BST Correctness ******************
Inserting the following numbers: [11, 12, 15, 17, 12, 19, 4, 5, 11,
19, 20, 32, 77, 65, 66, 88, 99, 10, 8, 19,
15, 66, 11, 19]
*** BST Structure (after insertion) ***
<11, null> <4, 11> <5, 4> <10, 5> <8,
10> <12, 11> <15, 12> <17, 15> <19, 17>
<20, 19> <32, 20> <77,
32> <65, 77> <66, 65> <88, 77> <99,
88>
Size of BST: 16
*** Searching BST ***
Found: [19, 12, 4, 5, 19, 20, 32, 99, 8, 12]
Did not find: [29, 3, 27, 34, 45, 37, 25, 25, 24, 16]
*** Deleting BST ***
Deleted: [12, 15, 5, 17, 19, 4, 20, 32, 99, 10, 8]
Did not find: [16, 5, 19, 17, 19, 39, 19, 15, 21]
*** BST Structure (after deletion) ***
<11, null> <77, 11> <65, 77> <66, 65>
<88, 77>
Size of BST: 5
****************** Clean up ******************
Size of hash table: 0
Size of BST: 0
Implementation of the methods: 
BSTNode *search(int key) {
        if
(root == NULL || root->key == key)
          
return root;
        if
(root->key < key)
         
return search(root->right, key);
       return
search(root->left, key);
}
BSTNode *insert(int val) {
     if(!root)
    {
        return
new BST(value);
    }
    if(value >
root->data)
    {
        root->right
= Insert(root->right, value);
    }
    else
    {
root->left = Insert(root->left, value);
    }
    return
root;
}
bool remove(int key) {
    if (root ==
NULL) return false;
    if (key <
root->key)
        root->left
= remove(root->left, key);
    else if
(key > root->key)
        root->right
= remove(root->right, key);
    else
    {
if (root->left == NULL)
        {
            struct
node *temp = root->right;
            free(root);
            return
true;
        }
        else
if (root->right == NULL)
        {
            struct
node *temp = root->left;
            free(root);
            return
temp;
        }
       
struct node* temp =
minValueNode(root->right);
        root->key
= temp->key;
        root->right
= remove(root->right, temp->key);
    }
    return
false;
}
void removeNodeWithOneChild(BSTNode *node) {
if (root==NULL)
        return
NULL;
    root->left =
removeNodeWithOneChild(root->left);
    root->right =
removeNodeWithOneChild(root->right);
    if
(root->left==NULL &&
root->right==NULL)
        return
root;
    if
(root->left==NULL)
    {
        BSTNode
*new_root = root->right;
        free(root);
        return
new_root;
    }
    if
(root->right==NULL)
    {
        BSTNode
*new_root = root->left;
        free(root);
        return
new_root;
    }
    return
root;
}