---
# System prepended metadata

title: 13687 - Binary Search Tree - Delete
tags: [Data Structure]

---

# 13687 - Binary Search Tree - Delete
>author: Utin
###### tags: `Data Structure`

---

## Brief

## Solution 0 (Self-defined Stack)

```cpp=
// C++ program to demonstrate insertion
// in a BST recursively.

#include <iostream>
using namespace std;

class BST {
    private:
        int key;
        BST *left, *right;

    public:
        // Default constructor.
        BST();
        // Parameterized constructor.
        BST(int);
        BST* Insert(BST*, int);
        BST* deleteNode(BST*,int);
        BST* minValueNode(BST*);
        BST* searchValue(BST*,int);
        void Inorder(BST*);
        void Postorder(BST*);
        //void Preorder(BST*);
};
 
// Default Constructor definition.
BST::BST() : key(0), left(NULL), right(NULL) {}
 
// Parameterized Constructor definition.
BST::BST(int value) {
    key = value;
    left = right = NULL;
}
 
// Insert function definition.
BST* BST::Insert(BST* root, int key) {
    if (!root) {
        // Insert the first node, if root is NULL.
        return new BST(key);
    }

    // Insert data.
    if (key > root->key) {
        // Insert right node data, if the 'value'
        // to be inserted is greater than 'root' node data.

        // Process right nodes.
        root->right = Insert(root->right, key);
    }
    else {
        // Insert left node data, if the 'value'
        // to be inserted is greater than 'root' node data.

        // Process left nodes.
        root->left = Insert(root->left, key);
    }

    // Return 'root' node, after insertion.
    return root;
}
 
// Inorder traversal function.
// This gives data in sorted order.
void BST::Inorder(BST* root) {
    if (!root) return;
    Inorder(root->left);
    cout << root->key << endl;
    Inorder(root->right);
}
 
//Postorder traversal function.
void BST::Postorder(BST* root) {
    if (!root) return;
    Postorder(root->left);
    Postorder(root->right);
    cout << root->key << endl;
}
 
//minValueNode
BST* BST::minValueNode(BST* root) {
    BST* current = root;

    while (current && current->left != NULL)
        current = current->left;

    return current;
}
//deleteNode
BST* BST::deleteNode(BST* root, int key) {
    if (root == NULL)
        /*TODO*/
        return NULL;
    else if (key > root->key) {
        root->right = deleteNode(root->right, key);
        return root;
    }
    else if (key < root->key) {
        /*TODO*/
        root->left = deleteNode(root->left, key);
        return root;
    }
    else {
        if (root->left == NULL && root->right == NULL) {
            /*TODO*/
            delete root;
            return NULL;
        }
        else if (root->left == NULL) {
            /*TODO*/
            BST* tmp = root->right;
            root->key = tmp->key;
            root->left = tmp->left;
            root->right = tmp->right;
            delete tmp;
            return root;
        }
        else if (root->right == NULL) {
            /*TODO*/
            BST* tmp = root->left;
            root->key = tmp->key;
            root->left = tmp->left;
            root->right = tmp->right;
            delete tmp;
            return root;
        }
        //delete the node which has two childs
        else {
            BST* tmp = minValueNode(root->right);
            root->key = tmp->key;
            root->right = deleteNode(root->right, tmp->key);
            return root;
        }

    }
}
//searchValue
BST* BST::searchValue(BST* root, int key) {
    if (root == NULL)
        return NULL;
    else if (key > root->key)
        return searchValue(root->right, key);
    else if (key < root->key)
        return searchValue(root->left, key);
    else
        return root;
}
// Driver code
int main() {
    BST b, *root = NULL;
        string cmd;
        int count = 0;
        while (cin >> cmd) {
            if (cmd == "insert") {
                int x;
                cin >> x;
                if (count == 0)
                    root = b.Insert(root, x);
                else
                    b.Insert(root,x);
                count += 1;
            }
            else if (cmd == "delete") {
                int x;
                cin >> x;
                b.deleteNode(root, x);
                count -= 1;
            }
            else if (cmd == "inorder") {
                b.Inorder(root);
            }
            else if (cmd == "search") {
                int x;
                cin >> x;
                if (b.searchValue(root, x))
                    cout << "Found" << endl;
                else
                    cout << "Not Found" << endl;
            }
            else if (cmd == "postorder") {
                b.Postorder(root);
            }
            else if (cmd == "exit") {
                return 0;
            }
        }
    return 0;
}

// By Utin
```


## Reference