удалить в двоичном дереве поиска С++ (дерево не будет обновляться) и повреждение кучи

Я пытаюсь написать удаление узла для двоичного дерева. Это мои узлы и древовидные структуры:

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() получаю ошибку что порчу кучу.

Спасибо!


person user1195084    schedule 07.02.2012    source источник
comment
Вы можете прочитать это: tech-faq.com/binary- дерево-удаление-узла.html   -  person Mr.Anubis    schedule 07.02.2012
comment
Спасибо за ссылку, но я хочу знать, что не так с моим кодом, потому что логически он работает, но он даже не удаляет лист и не потому, что не находит его, а потому, что он рекурсивно перестраивает дерево.   -  person user1195084    schedule 09.02.2012
comment
Можете ли вы ввести свой код delMax?   -  person DotNetUser    schedule 19.02.2012


Ответы (1)


Создавая локальную переменную k и передавая ее адрес, назначения через *r влияют на локальную переменную, а не на какой-либо указатель в дереве.

Кроме того, запись node *&r может сэкономить вам несколько & и *.

person Davis Herring    schedule 19.05.2019