Usuwanie
Lekcja 11 z 16 w kursie Drzewo AVL – struktury danych, seria #10 w Coddy.
Usuwanie to usuwanie z BST z takim samym sposobem równoważenia jak przy wstawianiu. W przypadku usuwanego węzła trzeba obsłużyć trzy sytuacje: brak dzieci (po prostu go usuń), jedno dziecko (zastąp go tym dzieckiem) lub dwoje dzieci — trudniejszy przypadek, w którym zastępujesz wartość węzła jego następnikiem w porządku inorder (najmniejszą wartością w jego prawym poddrzewie), a następnie usuwasz ten następnik z prawego poddrzewa.
Podobnie jak przy wstawianiu, każdy przodek na drodze powrotnej w górę ponownie oblicza swoją wysokość i współczynnik równowagi, stosując odpowiedni przypadek rotacji, jeśli drzewo staje się niezrównoważone. Logika równoważenia jest identyczna jak przy wstawianiu; zmienia się tylko warunek wyboru przypadku, który teraz sprawdza współczynnik równowagi cięższego dziecka zamiast tego, gdzie trafiła nowa wartość.
Wyzwanie
ŚredniNapisz metodę delete(value) w klasie AVLTree (dobrze sprawdzi się rekurencyjna funkcja pomocnicza). Usuń value za pomocą standardowego usuwania z BST: w przypadku węzła z dwojgiem dzieci zastąp jego wartość najmniejszą wartością w jego prawym poddrzewie, a następnie usuń tę wartość z prawego poddrzewa. Jeśli nie znaleziono value, nic nie rób. W drodze powrotnej ponownie oblicz wysokości i przywróć równowagę dokładnie tak jak robi to insert.
Spróbuj swoich sił
#include <stdio.h>
#include <string.h>
#include "avltree.h"
static void preorderValues(Node* node, int* vals, int* count) {
if (node == NULL) {
return;
}
vals[(*count)++] = node->value;
preorderValues(node->left, vals, count);
preorderValues(node->right, vals, count);
}
int main(void) {
AVLTree* tree = AVLTree_create();
char line[256];
while (fgets(line, sizeof(line), stdin) != NULL) {
line[strcspn(line, "\r\n")] = '\0';
char cmd[32];
int arg;
int parsed = sscanf(line, "%31s %d", cmd, &arg);
if (parsed >= 1 && strcmp(cmd, "insert") == 0) {
AVLTree_insert(tree, arg);
}
if (parsed >= 1 && strcmp(cmd, "delete") == 0) {
AVLTree_delete(tree, arg);
}
if (parsed >= 1 && strcmp(cmd, "search") == 0) {
if (AVLTree_search(tree, arg)) {
printf("true\n");
}
if (!AVLTree_search(tree, arg)) {
printf("false\n");
}
}
if (parsed >= 1 && strcmp(cmd, "preorder") == 0) {
int vals[10000];
int count = 0;
preorderValues(tree->root, vals, &count);
for (int i = 0; i < count; i++) {
if (i > 0) {
printf(" ");
}
printf("%d", vals[i]);
}
printf("\n");
}
}
return 0;
}
Wszystkie lekcje w sekcji Drzewo AVL – struktury danych, seria #10
Poćwicz samodzielnie: Kompilator C online