Menu
Coddy logo textTech

Albero binario di ricerca (BST)

Ultimo aggiornamento

Un albero binario di ricerca mantiene i valori in ordine: per ogni nodo, tutti i valori del sottoalbero sinistro sono più piccoli e tutti quelli del sottoalbero destro sono più grandi. Per inserire o trovare un valore parti dalla radice e scendi ripetutamente a sinistra o a destra in base al confronto, così ogni passo dimezza lo spazio di ricerca. Premi play qui sopra per vedere i valori collocati per confronto e una ricerca che scende lungo l'albero.

Su un albero bilanciato queste operazioni richiedono tempo O(log n). Il problema: inserire dati già ordinati fa degenerare l'albero in una lista concatenata con operazioni O(n), ed è proprio per questo che esistono varianti autobilanciate come gli alberi AVL e rosso-neri.

Complessità temporale e spaziale

OperazioneBilanciatoCaso peggiore (sbilanciato)
RicercaO(log n)O(n)
InserimentoO(log n)O(n)
EliminazioneO(log n)O(n)
SpazioO(n)O(n)

Passo dopo passo (inserimento)

PassoCosa succede
1Se l'albero è vuoto, il nuovo valore diventa la radice.
2Altrimenti parti dalla radice.
3Se il valore è più piccolo, vai al figlio sinistro; se è più grande, vai a destra.
4Ripeti finché non raggiungi un posto vuoto.
5Aggancia lì il nuovo valore come foglia.

Esempio svolto

Inserimento di [5, 3, 8, 1, 4] in un albero vuoto, un valore alla volta:

InserimentoPercorso seguitoAzione
5-L'albero è vuoto, quindi 5 diventa la radice.
353 < 5, vai a sinistra; il posto è vuoto, aggancia 3 come figlio sinistro di 5.
858 > 5, vai a destra; il posto è vuoto, aggancia 8 come figlio destro di 5.
15 -> 31 < 5 vai a sinistra, poi 1 < 3 vai a sinistra; aggancia 1 come figlio sinistro di 3.
45 -> 34 < 5 vai a sinistra, poi 4 > 3 vai a destra; aggancia 4 come figlio destro di 3.

Quando usare un albero binario di ricerca

Usalo quandoEvitalo quando
Ti servono l'ordinamento e ricerche veloci, e gli inserimenti arrivano in ordine casuale.I tuoi dati arrivano già ordinati: un BST non bilanciato degrada a O(n) per operazione.
Vuoi che la visita in ordine restituisca i valori in sequenza ordinata senza costi extra.Ti servono solo test di appartenenza senza ordine: una tabella hash dà ricerche O(1) in media.
Ti servono query su intervalli o il successore/predecessore di una chiave.Ti servono limiti O(log n) garantiti: scegli piuttosto un albero AVL o rosso-nero autobilanciato.
L'insieme di dati cambia spesso e un array ordinato statico sarebbe costoso da aggiornare.L'insieme di dati è fisso e di sola lettura: un array ordinato con ricerca binaria è più semplice e sfrutta meglio la cache.

Codice Binary Search Tree

Un'implementazione di Binary Search Tree pulita ed eseguibile in Python, JavaScript, Java, C++, C. Scegli un linguaggio, copia il codice o aprilo già caricato nel Playground di Coddy.

Codice Binary Search Tree in Python

Python
1class Node:2    def __init__(self, key):3        self.key = key4        self.left = None5        self.right = None6
7
8def insert(node, key):9    if node is None:10        return Node(key)11    if key < node.key:12        node.left = insert(node.left, key)13    elif key > node.key:14        node.right = insert(node.right, key)15    return node  # duplicates are ignored16
17
18def search(node, key):19    if node is None:20        return False21    if key == node.key:22        return True23    if key < node.key:24        return search(node.left, key)25    return search(node.right, key)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.key] + inorder(node.right)32
33
34root = None35for key in [8, 3, 10, 1, 6, 14, 4, 7]:36    root = insert(root, key)37
38print("Inorder (sorted):", inorder(root))39print("search(6): ", search(root, 6))40print("search(5): ", search(root, 5))
Esegui questo codice nel playground Python

Domande frequenti sull'albero binario di ricerca

Qual è la complessità temporale di un albero binario di ricerca?
Ricerca, inserimento ed eliminazione sono O(log n) su un albero bilanciato, perché ogni confronto scarta metà dei nodi rimasti. Nel caso peggiore, un albero ridotto a una catena da inserimenti ordinati, degradano a O(n).
Qual è la differenza tra un albero binario e un albero binario di ricerca?
Un albero binario è qualsiasi albero in cui ogni nodo ha al massimo due figli, senza regole di ordine. Un albero binario di ricerca aggiunge l'invariante per cui i valori del sottoalbero sinistro sono più piccoli e quelli del sottoalbero destro più grandi del nodo, ed è questo che rende possibile la ricerca veloce.
Perché un albero binario di ricerca può diventare lento?
Se i valori vengono inseriti in ordine (crescente o decrescente), ogni nuovo nodo finisce dallo stesso lato, producendo un albero alto e sbilanciato che si comporta come una lista concatenata: O(n) per operazione. Gli alberi autobilanciati (AVL, rosso-neri) ruotano i nodi per evitarlo.
Qual è la differenza tra un albero binario di ricerca e una tabella hash?
Una tabella hash dà ricerche O(1) in media ma non conserva le chiavi in un ordine particolare, quindi non può rispondere a query su intervalli o sul successore. Un albero binario di ricerca è un po' più lento, O(log n), ma mantiene le chiavi ordinate, così puoi scorrerle in ordine e trovare i valori più vicini. Scegli un BST quando l'ordine conta e una tabella hash quando ti servono solo test di appartenenza.
Quando conviene usare un albero autobilanciato invece di un BST semplice?
Usa un albero autobilanciato (AVL, rosso-nero) ogni volta che non puoi controllare l'ordine di inserimento e ti servono prestazioni O(log n) garantite. Un BST semplice va bene per imparare, per insiemi di dati piccoli o quando le chiavi arrivano in ordine casuale, ma non offre protezione contro il caso peggiore sbilanciato.
La visita in ordine di un BST restituisce valori ordinati?
Sì. Visitare il sottoalbero sinistro, poi il nodo, poi il sottoalbero destro restituisce le chiavi in ordine crescente, come conseguenza diretta dell'invariante del BST. Un errore comune è aspettarsi lo stesso da un albero binario semplice: senza la regola di ordine, la visita in ordine non produce una sequenza significativa.
Illustrazione dei linguaggi di programmazione di Coddy

Padroneggia gli algoritmi con Coddy

INIZIA