Я пытаюсь написать удаление узла для двоичного дерева. Это мои узлы и древовидные структуры:
class node{
public:
int value;
node* left;
node* right;
~node();
};
class tree{
public:
node* root;
....
};
И это функция, которую я написал:
void tree::del(node** r, int x){
if(*r)
{
if((*r)->value==x)
{
if(!(*r)->left)
*r= (*r)->right;
else if(!(*r)->right)
*r= (*r)->left;
else
{
int k= delMax((*r)->left);
(*r)->value= k;
}
}
else if((*r)->value > x)
{
node* k= (*r)->left;
del(&k, x);
}
else
{
node* k= (*r)->right;
del(&k, x);
}
}}
Моя проблема в том, что как только я добираюсь до нужного элемента, указатели меняются, но затем, когда дерево рекурсивно перестраивается, оно возвращается к тому, что было изначально, и ни один элемент не удаляется. Я думал, что передача указателя на указатель решит эту проблему, но это не так. delMax
удаляет из дерева максимальный элемент и работает корректно сам по себе.
Кроме того, в деструкторах для последних двух классов, как мне разместить удаления? потому что, если я просто поставлю удаление правильно; удалить слева; в ~node()
и удалить рут в ~tree()
получаю ошибку что порчу кучу.
Спасибо!