מחיקה
שיעור 11 מתוך 16 בקורס עץ AVL – סדרת מבני נתונים מס' 10 של Coddy.
מחיקה היא מחיקת BST עם אותו דפוס איזון מחדש כמו בהוספה. יש שלושה מצבים שצריך לטפל בהם עבור הצומת שמסירים: ללא ילדים (פשוט מסירים אותו), עם ילד אחד (מחליפים אותו בילד הזה), או עם שני ילדים — המקרה המסובך — שבו מחליפים את ערך הצומת בעוקב בסדר-תוך שלו (הערך הקטן ביותר בתת-העץ הימני שלו) ואז מוחקים את העוקב הזה מתת-העץ הימני במקום זאת.
בדיוק כמו בהוספה, כל אב קדמון בדרך חזרה למעלה מחשב מחדש את הגובה ואת מקדם האיזון שלו, ומחיל את מקרה הסיבוב המתאים אם הצומת נעשה לא מאוזן. לוגיקת האיזון מחדש זהה לזו שבהוספה; רק התנאי לבחירת המקרה בודק כעת את מקדם האיזון של הילד הכבד במקום את המקום שבו נוסף ערך חדש.
אתגר
בינוניכתבו מתודה delete(value) ב־AVLTree (עוזר רקורסיבי מתאים לכך היטב). הסירו את value באמצעות מחיקת BST סטנדרטית: עבור צומת עם שני ילדים, החליפו את הערך שלו בערך הקטן ביותר בתת־העץ הימני שלו, ואז מחקו את הערך הזה מתת־העץ הימני. אל תעשו דבר אם value לא נמצא. בדרך חזרה למעלה, חשבו מחדש את הגבהים ואיזנו מחדש בדיוק כמו ש־insert עושה.
נסו בעצמכם
#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;
}
כל השיעורים ביחידה עץ AVL – סדרת מבני נתונים מס' 10
תרגלו בעצמכם: קומפיילר C אונליין