Travessias sobre BSTs

From Wiki**3

Introdução

Travessias Recursivas

Travessia pre-order

   void traverse(link h, void (*visit)(link)) {
     if (!h) return;
     (*visit)(h);
     traverse(h->l);
     traverse(h->r);
   }

Travessia in-order

   void traverse(link h, void (*visit)(link)) {
     if (!h) return;
     traverse(h->l);
     (*visit)(h);
     traverse(h->r);
   }

Travessia post-order

   void traverse(link h, void (*visit)(link)) {
     if (!h) return;
     traverse(h->l);
     traverse(h->r);
     (*visit)(h);
   }

Travessias Não Recursivas

Travessia pre-order

Utiliza uma estrutura de dados (pilha) para manter as partes não processadas.

 void traverse(link h, void (*visit)(link)) {
   STACKinit(max);
   STACKpush(h);
   while (!STACKempty()) {
     (*visit)(h = STACKpop());
     if (h->r != NULL) STACKpush(h->r); 
     if (h->l != NULL) STACKpush(h->l); 
   }
 }

Travessia level-order

Utiliza uma estrutura de dados (fila) para manter as partes não processadas.

 void traverse(link h, void (*visit)(link)) {
   QUEUEinit(max);
   QUEUEput(h);
   while (!QUEUEempty()) {
     (*visit)(h = QUEUEget());
     if (h->r != NULL) QUEUEput(h->l); 
     if (h->l != NULL) QUEUEput(h->r); 
   }
 }