From 3736ad2384228205e8f04f5dc4e4d87b54df39d8 Mon Sep 17 00:00:00 2001 From: Pagwin Date: Thu, 21 Nov 2024 18:49:40 -0500 Subject: [PATCH] erase draft implemented --- Map.hpp | 48 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/Map.hpp b/Map.hpp index bac7fea..6172d5e 100644 --- a/Map.hpp +++ b/Map.hpp @@ -558,14 +558,52 @@ private: } public: - // TODO: erase via iterator + // TODO: check that the way of reconnecting next and prev works void erase(Iterator pos) { // simple cases Node *ref = pos.ref; - - // 2 children just copy over the in order successor and remove successor - - this->complex_erase(pos); + // 2 children + if (ref->left != nullptr && ref->right != nullptr) { + Node *next = ref->next; + Node *prev = ref->prev; + *ref = *next; + prev->next = next; + next->prev = prev; + this->erase(Iterator{next}); + } + // single child which is left + else if (ref->left != nullptr && ref->right == nullptr) { + Node *next = ref->next; + Node *prev = ref->prev; + *ref = *ref->left; + prev->next = next; + next->prev = prev; + } + // single child which is right + else if (ref->left == nullptr && ref->right != nullptr) { + Node *next = ref->next; + Node *prev = ref->prev; + *ref = *ref->right; + prev->next = next; + next->prev = prev; + } + // no children and root + else if (ref->left == nullptr && ref->right == nullptr) { + this->root = nullptr; + this->nodes.erase(ref->value); + } + // no children and red + else if (ref->left == nodes.end() && ref->right == nodes.end()) { + Node *next = ref->next; + Node *prev = ref->prev; + prev->next = next; + next->prev = prev; + this->nodes.erase(ref->value); + } + // complicated case of black node with no kids + else { + this->complex_erase(pos); + } } void erase(const Key_T &key) { this->erase(this->find(key)); } void clear() {