Add solution for name removal (bst).

This commit is contained in:
paulusja 2025-12-11 13:03:26 +01:00
parent 1c76a98186
commit 5a4a806ed4
2 changed files with 58 additions and 25 deletions

View File

@ -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();

View File

@ -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)