Visite
Una visita generica su un albero può essere implementata come:
visita(Node v)
s = [v] // Lista usata come pila LIFO
while len(s) > 0
n = pop(s) // Assunto 𝛩(1)
if n != NIL
print(n.info) // Visita il nodo
for f in figli(n)
push(s, f) // Assunto 𝛩(1)
da cui si può dimostrare che la complessità temporale e spaziale sono entrambe , dato che i nodi vengono aggiunti e rimossi da s
una sola volta, necessitando al più iterazioni e spazio.
Un albero di esempio può essere
da cui verrà prodotto l'output 0134256
.
Depth first search
La visita generica è una visita in profondità del tipo pre-order, e può essere espressa ricorsivamente come:
DFS(Node r)
if r != NIL
print(r.info) // Visita il nodo
DFS(r.left)
DFS(r.right)
che diventa in-order se la visita avviene dopo la prima DFS
e post-order se avviene dopo la seconda.
Nell'esempio, la visita in-order genera l'output 3140526
mentre quella post-order l'output 3415620
.
Si può dimostrare per sostituzione che anche questa visita ha , partendo da: dove è il numero di nodi nel sottoalbero sinistro e e sono costanti. Dato che è lineare per ipotesi, si pone e va dimostrato per induzione completa su :
-
Caso base per , si ha ma anche quindi
-
Passo induttivo data l'ipotesi induttiva , si ha:
quindi , per cui .
Breadth first search
In questo caso la visita avviene a livelli, accedendo sequenzialmente ad ogni nodo dello stesso livello:
BFS(Node r)
q = [r] // Lista usata come coda FIFO
while len(q) > 0
n = dequeue(q) // Assunto 𝛩(1)
if n != NIL
print(n.info)
enqueue(q, n.left) // Assunto 𝛩(1)
enqueue(q, n.right)
che avrà complessità temporale e spaziale .
Nell'esempio, la visita genera l'output 0123456
.