Удаление из идеально сбалансированного БДП

Идеально сбалансированные БДП – вставка и исключение. Вставку написал, было не сложно, а вот как удалять элемент и опять балансировать дерево, не понимаю. Можете описать алгоритм или написать рабочий метод, буду очень благодарен.

upd: метод или алгоритм должен быть рекурсивным.

Класс, дерева:

    class TREE
    {
    private:
        int Key;
        TREE *duk; //Корень дерева.
        TREE *Left;
        TREE *Right;
    public:
        TREE() { duk = nullptr; }
        ~TREE();
        TREE **GetDuk() { return &duk; }
        void Insert(int n,TREE** node, int newKey);
        void RemoveElem(...); //Нужная функция.
        void Tree (int, TREE **);

    };

void TREE::Tree (int n,TREE **p){
// Построение идеально сбалансированного
//           дерева с n вершинами.
// *p - указатель на корень дерева.

    TREE *now;
    int x,nl,nr;
    ++depth;
    now = *p;
    if  (n==0) *p = NULL;
    else
    {
        nl = n/2;
        nr = n - nl - 1;
        if(!(cin>>x)){

            cout<<"Eror input should be digit!\n";
            cin.clear();
            exit(0);
        }
        else {
            now = new TREE;
            (*now).Key = x;
            Tree(nl, &((*now).Left));
            Tree(nr, &((*now).Right));
            *p = now;
        }
    }
}

    void TREE::Insert(int n,TREE** node, int newKey){
        int nl,nr;
        nl = n/2;
        nr = n - nl - 1;
    
        if(nl > nr){
            if(n!=0){
                Insert(nr,&((*node))->Right, newKey);
            }else{
                TREE* now = new TREE;
                now->Key = newKey;
                now->Right = nullptr;
                now->Left = nullptr;
                *node = now;
            }
        }else if(nl <= nr){
            if(n!=0){
                Insert(nl,&((*node))->Left, newKey);
            }else{
                TREE* now = new TREE;
                now->Key = newKey;
                now->Right = nullptr;
                now->Left = nullptr;
                *node = now;
            }
        }
    }

    void TREE::RemoveElem(...){//Нужная функция.
       ...
    }

Ответы (0 шт):