Parcurgerea arborilor binari


Parcurgerile sunt cele mai frecvent utilizate operaţii pe arbori. A parcurge un arbore înseamnă a vizita fiecare nod al arborelui o singură dată, în scopul prelucrării informaţiei asociate nodului.
Există mai multe posibilităţi de parcurgere a arborilor- în adâncime (preordine, inordine, postordine) sau pe niveluri, dar în toate cazurile atât arborele, cât şi subarborii sunt prelucraţi în acelaşi mod.
Principalele moduri de parcurgere a arborilor binari sunt:

  • parcurgerea în adâncime; și
  • parcurgerea pe niveluri.
Figura nr. 11 – Parcurgerea arborilor binari

              1. Parcurgerile în adâncime
              În toate cele trei tipuri de parcurgere în adâncime se vizitează mai întâi subarborele stâng, apoi subarborele drept. Diferenţa constă în poziţia rădăcinii faţă de cei doi subarbori. Fie scrise recursiv, fie iterativ, procedurile de parcurgere în adâncime necesită o stivă.
              Clasificarea tipurilor de parcurgere în adâncime:
             • Preordine (rsd):
             Pentru a parcurge un arbore binar în preordine, se vizitează mai întâi rădăcina, se parcurge în preordine subarborele stâng, apoi se parcurge în preordine subarborele drept.
Exemplu: Parcurgerea în preordine a arborelui din Figura nr.11 este: 1 2 4 5 3 6 7 8
            • Inordine (srd):
            Pentru a parcurge în inordine un arbore binar, se parcurge în inordine subarborele stâng, se vizitează radăcina, apoi se parcurge în inordine subarborele drept.
Exemplu: Parcurgerea în inordine a arborelui din Figura nr.11 este: 4 2 5 1 6 3 7 8
            • Postordine (sdr):
            Pentru a parcurge în postordine un arbore binar, se parcurge în postordine subarborele stâng, apoi cel drept, apoi se vizitează rădăcina.
Exemplu: Parcurgerea în postordine a arborelui din Figura nr.11 este: 4 5 2 6 8 7 3 1



Programul urmator genereaza un arbore binar memorat in heap si il parcurge prin cele 3 metode.

#include<iostream.h>
#include<conio.h>
struct nod{int nro;
               nod*st,*dr;};

nod *r;

void svd(nod *c)
   {if(c)
            {svd(c->st);
             cout<<c->nro<<" ";
             svd(c->dr);
            }
   }

void vsd(nod *c)
   {if(c)
            {cout<<c->nro<<" ";
             vsd(c->st);
             vsd(c->dr);
            }
   }

void sdv(nod *c)
   {if(c)
            {sdv(c->st);
             sdv(c->dr);
             cout<<c->nro<<" ";
            }
   }

nod* citire_h()
{int nr;
 nod*c;
 cout<<"nr de ordine ";
 cin>>nr;
 if(nr)
       {c=new nod;
            c->nro=nr;
            c->st=citire_h();
            c->dr=citire_h();
            return c;
            }
 else
     return 0;
}

void main()
{clrscr();
 r=citire_h();
cout<<endl<<"parcurgere svd - in inordine "<<endl;
svd(r);
cout<<endl<<"parcurgere vsd - in preordine "<<endl;
vsd(r);
cout<<endl<<"parcurgere sdv - in postordine "<<endl;
sdv(r);
getch();

}


            2. Parcurgerea pe niveluri
Se vizitează întâi rădăcina, apoi fiul stâng al rădăcinii, apoi cel drept şi se continuă în acest mod vizitând nodurile de pe fiecare nivel de la stânga la dreapta.
Exemplu: Parcurgerea în postordine a arborelui din Figura nr.11 este: 1 2 3 4 5 6 7 8