Menu
Coddy logo textTech

Wstawianie

Lekcja 9 z 16 w kursie Drzewo AVL – struktury danych, seria #10 w Coddy.

insert zaczyna się jak zwykłe wstawianie do binarnego drzewa wyszukiwań: schodź w dół, porównując wartości, idź w lewo lub w prawo i umieść nowy węzeł w miejscu, w którym znajdziesz pusty slot (pomijaj duplikaty). Część AVL następuje podczas powrotu w górę: po umieszczeniu węzła każdy przodek na ścieżce ponownie oblicza swoją height i sprawdza współczynnik równowagi.

Jeśli węzeł przestaje być zrównoważony, to która strona jest cięższa i gdzie trafiła nowa wartość, razem określają, który z czterech przypadków ma zastosowanie: left-left i right-right wymagają pojedynczej rotacji, a left-right i right-left wymagają dwóch: najpierw rotacji wewnętrznej, która prostuje zygzak, a następnie zewnętrznej.

challenge icon

Wyzwanie

Średni

Napisz metodę insert(value) w klasie AVLTree (najczyściej będzie użyć rekurencyjnej funkcji pomocniczej). Wstaw value jak do zwykłego drzewa BST, pomijając je, jeśli już występuje. Podczas powrotu w górę ponownie oblicz wysokość i współczynnik równowagi każdego węzła, a jeśli węzeł jest niezrównoważony, zastosuj odpowiednią rotację (lub parę rotacji), zanim wrócisz w górę stosu wywołań.

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, "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");
        }
        if (parsed >= 1 && strcmp(cmd, "height") == 0) {
            printf("%d\n", AVLTree_getHeight(tree, tree->root));
        }
    }
    return 0;
}

Wszystkie lekcje w sekcji Drzewo AVL – struktury danych, seria #10

Poćwicz samodzielnie: Kompilator C online