Я реализовал метод удаления для двоичного дерева поиска, обратив псевдоним из CLRS. Ниже приведена ошибка. Первоначально, когда я удаляю листовой узел, он работает, но когда я удаляю корневой узел, код выходит из строя. В частности - значение нового корневого узла поступает в метод трансплантации, но в методе delete_node он снова показывает значение старого узла. Не могли бы вы указать ошибку. Заранее спасибо.Проблема реализации при удалении узла двоичного дерева поиска в C++
class bst {
public:
struct node
{
int data;
struct node* ltson;
struct node* rtson;
struct node* parent;
}*btroot;
// replaces the subtree rooted at node u with the subtree rooted at node v
void transplant(bst T, struct node* u, struct node *v) {
if(u->parent==NULL){
T.btroot = v;
}
else if(u->parent->ltson == u)
u->parent->ltson = v;
else
u->parent->rtson = v;
if(v!=NULL)
v->parent = u->parent;
}
void delete_node(bst T,struct node* z) {
struct node * y;
if(z->ltson==NULL)
transplant(T,z,z->rtson);
else if(z->rtson==NULL)
transplant(T,z,z->ltson);
else {
y = minimum(z->rtson);
if(y->parent!=z) {
transplant(T,y,y->rtson);
y->rtson = z->rtson;
y->rtson->parent = y;
}
transplant(T,z,y);
cout<< (T.btroot->data)<<endl; //Old value of root is being printed
y->ltson = z->ltson;
y->ltson->parent = y;
}
}
};
Возможно, вам необходимо передать переменные по ссылке, чтобы изменить значение в вызывающем коде. Помните: в функции вы изменяете копию переменной, а не действительную переменную, когда вы передаете переменную по значению. ('void transplant (bst & T, struct node * u, struct node * v);') –
Возможно, я что-то упустил, но где происходит удаление или освобождение? –
Если T - текущее дерево, то почему вы передаете его функции вообще? Он уже доступен через этот указатель. –