Una Binary Search Tree è una struttura dati ad albero binario in cui:
- Ogni nodo ha al massimo due figli: sinistro e destro.
- Per ogni nodo:
- i valori nel sottoalbero sinistro sono minori del valore del nodo.
- i valori nel sottoalbero destro sono maggiori.
🔹 Implementazione base in C#
public class TreeNode
{
public int Value;
public TreeNode Left;
public TreeNode Right;
public TreeNode(int value)
{
Value = value;
}
public void Insert(int newValue)
{
if (newValue < Value)
{
if (Left == null)
Left = new TreeNode(newValue);
else
Left.Insert(newValue);
}
else
{
if (Right == null)
Right = new TreeNode(newValue);
else
Right.Insert(newValue);
}
}
public bool Contains(int target)
{
if (target == Value)
return true;
else if (target < Value)
return Left?.Contains(target) ?? false;
else
return Right?.Contains(target) ?? false;
}
}🔹 Domande correlate:
- Come si può evitare che una BST diventi sbilanciata?
👉 Utilizzando una self-balancing BST come un AVL Tree o un Red-Black Tree, che riequilibrano l’albero dopo ogni inserimento/rimozione. - Qual è la complessità temporale per insert/search?
- BST Bilanciata:
O(log n) - BST Sbilanciata (es. inserimento ordinato):
O(n)
- BST Bilanciata:
- . Come gestiresti i duplicati in una BST?
- Opzioni:
- Non permettere duplicati.
- Permettere duplicati solo a sinistra o a destra.
- Aggiungere un contatore al nodo.
- Opzioni:
- Come elimineresti un nodo in una BST?
- Tre casi:
- Nodo senza figli → rimuovi direttamente.
- Nodo con un figlio → ricollega il figlio al padre.
- Nodo con due figli → trova il successore in-order (minimo del sottoalbero destro), copia il valore e rimuovi il nodo duplicato.
- Tre casi:
- Quando una BST è inefficiente?
- Quando è sbilanciata (es. inserendo dati ordinati) diventa una lista →
O(n)in search/insert/delete.
- Quando è sbilanciata (es. inserendo dati ordinati) diventa una lista →
- Con quale struttura sostituiresti una BST per avere garanzia di performance?
- AVL Tree, Red-Black Tree, o B-Tree (in ambienti disk-based o database).
Esercizi
- ✏️ Scrivi una funzione che restituisca il minimo e massimo valore in una BST.
- ✏️ Scrivi una funzione che restituisca il numero di nodi.
- ✏️ Data una BST e un valore target, restituisci il percorso (lista di valori) fino al nodo.
- ✏️ Scrivi una funzione per verificare se un albero è effettivamente una BST valida.