Altezza

L’altezza di un nodo rappresenta la quantità totale di livelli massimi.
È più facile mostrarlo che spiegarlo…


Limiti

Il limite inferiore dell’altezza è $log_2(N)$.
Ovvero quando sono perfettamente distribuiti, ogni livello è completo (ogni nodo ha 2 o 0 figli).

Il limite superiore dell’altezza è $N$.
Ovvero quando ci sono N elementi consecutivi crescenti, ad esempio.


Implementazione

Wrapper

int TREEheight(BST bst) {
    return heightR(bst->root);
}

Ricorsiva

int heightR(node root) {
    if (root == NULL) {
        return 0;
    }

    int heightL = heightR(root->left);
    int heightR = heightR(root->right);
    return 1 + max(heightL, heightR);
}

Profondità

Spesso confusa con l’altezza, o equivalente, ma si può dare una definizione diversa.
La profondità di un albero è la sua vicinanza con la radice, che avrà profondità 0.
I figli della radice hanno profondità 1, e così via.

BST

Wrapper

int BSTdepth(BST bst, Key key) {
    return depthR(0, bst->root, key);
}

Ricorsiva

int depthR(int level, node root, Key key) {
    if (root == NULL) {
        // Chiave non trovata
        return -1;
    }

    int compare = KEYcompare(root->key, key);
    if (compare == 0) {
        return level;
    }

    return depthR(level + 1, compare > 0 ? root->right : root->left, key);
}

Tree

Negli alberi normali, non possiamo ricercare il valore dicotomicamente, quindi siamo costretti a cercarlo prima a sx, e se presente, riproviamo a dx.

Wrapper

int TREEdepth(Tree tree, Key key) {
    return depthR(0, tree->root, key);
}

Ricorsiva

int depthR(int level, node root, Key key) {
    if (root == NULL) {
        // La chiave è in questo ramo
        return -1;
    }

    if (KEYcompare(root->key, key) == 0) {
        // Chiave trovata
        return level;
    }

    // Cerco prima nel sottoalbero sinistro
    int depth = depthR(level + 1, root->left, key);
    if (depth == -1) {
        // Se non c'è, provo nel destro
        depth = depthR(level + 1, root->right, key);
    }
    // Se è stata trovata in un sottoalbero sono felice, altrimenti ritorno comunque -1
    return depth;
}

Ampiezza

L’ampiezza di un nodo è quanti nodi sono presenti in quel livello.


Bilanciamento

Un albero si dice bilanciato quando tutti i cammini dalla radice alle foglie hanno la stessa lunghezza.

Oppure, quando il livello delle foglie è uguale all’altezza dell’albero.
oppure all’altezza - 1

Il bilanciamento su richiesta partiziona il BST attorno la chiave mediana inferiore, per rendere mediamente più performante la ricerca.

Conta dello sbilanciamento:
profondità max - profondità min
oppure altezza max - altezza min