Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template <class T>
- bool Tree<T>::remove(const T &item)
- {
- Node ** current = &root_; // указатель на удаляемый узел
- // поиск удаляемого узла
- while (*current != NULL && (*current)->key_ != item)
- {
- if ((*current)->key_ < item)
- current = &(*current)->right_;
- else
- current = &(*current)->left_;
- }
- if (*current == NULL) // удаляемое значение не найдено
- return false;
- if ((*current)->left_ == NULL) // левое поддерево отсутствует
- *current = (*current)->right_;
- else if ((*current)->right_ == NULL) // правое поддерево отсутсвует
- *current = (*current)->left_;
- else
- {
- // оба поддерева не пусты
- // поиск узла заместителя в правом поддереве
- Node ** nodeToReplace = & (*current)->right_;
- while ((*nodeToReplace)->left_)
- {
- nodeToReplace = &(*nodeToReplace)->left_;
- }
- // замещенеие значения в удаляемом узле
- (*current)->key_ = (*nodeToReplace)->key_;
- // физическое удаление узла-заместителя из дерева
- *nodeToReplace = (*nodeToReplace)->right_;
- }
- return true;
- }
Add Comment
Please, Sign In to add comment