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.

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 .

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.