Guest User

Untitled

a guest
Jan 24th, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.22 KB | None | 0 0
  1. template <class T>
  2. bool Tree<T>::remove(const T &item)
  3. {
  4.     Node ** current = &root_; // указатель на удаляемый узел
  5.     // поиск удаляемого узла
  6.     while (*current != NULL && (*current)->key_ != item)
  7.     {
  8.         if ((*current)->key_ < item)
  9.             current = &(*current)->right_;
  10.         else
  11.             current = &(*current)->left_;
  12.     }
  13.    
  14.     if (*current == NULL) // удаляемое значение не найдено
  15.         return false;
  16.     if ((*current)->left_ == NULL) // левое поддерево отсутствует
  17.         *current = (*current)->right_;
  18.     else if ((*current)->right_ == NULL) // правое поддерево отсутсвует
  19.         *current = (*current)->left_;
  20.     else
  21.     {
  22.         // оба поддерева не пусты
  23.         // поиск узла заместителя в правом поддереве
  24.         Node ** nodeToReplace = & (*current)->right_;
  25.         while ((*nodeToReplace)->left_)
  26.         {
  27.             nodeToReplace = &(*nodeToReplace)->left_;
  28.         }
  29.        
  30.         // замещенеие значения в удаляемом узле
  31.         (*current)->key_ = (*nodeToReplace)->key_;
  32.         // физическое удаление узла-заместителя из дерева
  33.         *nodeToReplace = (*nodeToReplace)->right_;
  34.     }
  35.  
  36.     return true;
  37. }
Add Comment
Please, Sign In to add comment