2013-07-22 2 views
0

Я реализовал метод удаления для двоичного дерева поиска, обратив псевдоним из 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; 
      } 
     } 
}; 
+1

Возможно, вам необходимо передать переменные по ссылке, чтобы изменить значение в вызывающем коде. Помните: в функции вы изменяете копию переменной, а не действительную переменную, когда вы передаете переменную по значению. ('void transplant (bst & T, struct node * u, struct node * v);') –

+2

Возможно, я что-то упустил, но где происходит удаление или освобождение? –

+1

Если T - текущее дерево, то почему вы передаете его функции вообще? Он уже доступен через этот указатель. –

ответ

0

Я думаю, что вам не хватает цикла while или итератора для прохождения через двоичное дерево. Это будет искать узел, который необходимо удалить, а затем удалить его независимо от его текущей позиции.

+0

@JonathanLeffler Спасибо! После передачи переменных по ссылке код работает корректно. Но когда я освобождаю «z» в методе delete_node, программа вылетает из строя. Не могли бы вы предложить некоторые исправления. – rishabh

+0

Теперь эта проблема исправлена, не могли бы вы сказать, хорошо ли использовать конструктор внутри класса или есть лучший способ его реализовать? – rishabh

+0

@Neil Kirk Спасибо за совет, теперь я использую этот «указатель». – rishabh

Смежные вопросы