Удаление из идеально сбалансированного БДП
Идеально сбалансированные БДП – вставка и исключение. Вставку написал, было не сложно, а вот как удалять элемент и опять балансировать дерево, не понимаю. Можете описать алгоритм или написать рабочий метод, буду очень благодарен.
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(...){//Нужная функция.
...
}