diff --git a/09_bst/main.c b/09_bst/main.c index 0fdac6f..b4d5fbf 100644 --- a/09_bst/main.c +++ b/09_bst/main.c @@ -18,7 +18,7 @@ int main() printf("\nNames in archive:\n"); printNames(); printf("\n"); -/* + for(int i = 0; i < lenNamesToRemove; i++) { printf("Removing %s ...\n", namesToRemove[i]); @@ -28,7 +28,7 @@ int main() printf("\nNames in archive:\n"); printNames(); printf("\n"); -*/ + printf("Clearing archive ...\n"); clearArchive(); diff --git a/09_bst/namesarchive.c b/09_bst/namesarchive.c index 227ac8c..90af5e3 100644 --- a/09_bst/namesarchive.c +++ b/09_bst/namesarchive.c @@ -68,29 +68,6 @@ void printNames() { printNamesRec(root); } -/* - -static QueueElem *removeElemRek(QueueElem *elem, const char *name) -{ - if(elem != NULL) - { - if(strcmp(elem->name, name) == 0) - { - QueueElem *elemToRemove = elem; - elem = elem->next; - disposeElem(elemToRemove); - } - else - elem->next = removeElemRek(elem->next, name); - } - return elem; -} - -void removeName(const char *name) -{ - head = removeElemRek(head, name); -} -*/ static void disposeNode(Node *node) { @@ -99,6 +76,62 @@ static void disposeNode(Node *node) free(node); } +static Node *removeNameRec(Node *root, const char *name) +{ + if(root != NULL) + { + if(strcmp(name, root->name) < 0) + root->left = removeNameRec(root->left, name); + else if(strcmp(name, root->name) > 0) + root->right = removeNameRec(root->right, name); + else + { + if(root->left == NULL) + { + Node *nodeToRemove = root; + root = root->right; + disposeNode(nodeToRemove); + } + else if(root->right == NULL) + { + Node *nodeToRemove = root; + root = root->left; + disposeNode(nodeToRemove); + } + else + { + Node *succParent = root; + Node *succ = succParent->right; + + while(succ->left != NULL) + { + succParent = succ; + succ = succ->left; + } + + if(succParent == root) + { + succParent->right = succ->right; + } + else + { + succParent->left = succ->right; + } + + free(root->name); + root->name = succ->name; + free(succ); + } + } + } + return root; +} + +void removeName(const char *name) +{ + root = removeNameRec(root, name); +} + static void clearNodeRec(Node *node) { if(node != NULL)