Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void remove(const T& data)
- {
- if (root_ == nullptr) return;
- bool found = false;
- Node* curr = root_;
- Node* parent = nullptr;
- while (curr != nullptr)
- {
- if (curr->data_ == data)
- {
- found = true;
- break;
- }
- else
- {
- parent = curr;
- if (data > curr->data_) curr = curr->right_;
- else curr = curr->left_;
- }
- }
- if (!found) return;
- if ((curr->left_ == nullptr && curr->right_ != nullptr) || (curr->left_ != nullptr && curr->right_ == nullptr))
- {
- if (curr->left_ == nullptr && curr->right_ != nullptr)
- {
- if (parent->left_ == curr)
- parent->left_ = curr->right_;
- else
- parent->right_ = curr->right_;
- delete curr;
- }
- else
- {
- if (parent->left_ == curr)
- parent->left_ = curr->left_;
- else
- parent->right_ = curr->left_;
- delete curr;
- }
- return;
- }
- if (curr->left_ == nullptr && curr->right_ == nullptr)
- {
- if (parent == nullptr)
- delete curr;
- else
- {
- if (parent->left_ == curr) parent->left_ = nullptr;
- else parent->right_ = nullptr;
- delete curr;
- }
- return;
- }
- if (curr->left_ != nullptr && curr->right_ != nullptr)
- {
- Node* chkr = curr->right_;
- if ((chkr->left_ == nullptr) && (chkr->right_ == nullptr))
- {
- curr = chkr;
- delete chkr;
- curr->right_ = nullptr;
- }
- else
- {
- if ((curr->right_)->left_ != nullptr)
- {
- Node* lcurr = curr->right_;
- Node* lcurrp = (curr->right_)->left_;
- while (lcurr->left_ != nullptr)
- {
- lcurrp = lcurr;
- lcurr = lcurr->left_;
- }
- curr->data_ = lcurr->data_;
- delete lcurr;
- lcurrp->left_ = nullptr;
- }
- else
- {
- Node* tmp;
- tmp = curr->right_;
- curr->data_ = tmp->data_;
- curr->right_ = tmp->right_;
- delete tmp;
- }
- }
- return;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement