Sunteți pe pagina 1din 22

Stucturi dinamice

de date. Arbori binari


Structura de date de tip arbore binar
Un arbore binar este un arbore în care fiecare nod are cel mult doi fii,
fiul stâng şi fiul drept.
Dacă în această figură se elimină rădăcina şi legăturile ei, se obţin doi arbori
binari care se numesc subarborii stâng şi drept ai arborelui iniţial. Deci,
arborele binar este o structură recursivă de date.
Declarare nod

Structura unui nod st inf dr


al arborelui binar

typedef struct nod


{ int inf; //sau orice alt tip pentru informație
nod * st, * dr;}; // adresele fiilor Definirea unui nod
ARB; //ARB – identificatorul tipului definit
Implementarea unui arbore
Operații cu Arbori binari

1) parcurgerea (traversarea) arborelui;


2) crearea arborelui;
3) căutarea (localizarea) unui nod;
4) inserarea unui nod;
5) ştergerea unui nod.
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
respectiv.
Parcurgerea
arborelor

în adâncime pe niveluri

preordine postordine
inordine
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.
Pentru arborele prezentat în figură, şirul parcurgerii pe
niveluri este:1 2 3 4 5 6 7 8.
Parcurgerea în adâncime
În preordine (RSD): se vizitează rădăcina, apoi tot în
preordine se vizitează nodurile subarborelui stâng şi
apoi acele ale subarborelui drept.
Exemplu (parcurgerea în preordine a arborelui din

figură):1, 2, 4, 7, 3, 5, 6, 8.
Parcurgerea în adâncime
În inordine (SRD): se vizitează în inordine nodurile
subarborelui stâng, apoi rădăcina, şi apoi tot în inordine,
nodurile subarborelui drept.
Exemplu (parcurgerea în inordine a arborelui din

figură): 4, 7, 2, 1, 5, 3, 8, 6.
Parcurgerea în adâncime
În postordine (SDR): se vizitează în postordine
nodurile subarborelui stâng, apoi tot în postordine,
nodurile subarborelui drept şi, la sfârşit rădăcina.
Exemplu (parcurgerea în postordine a arborelui din

paragraful precedent):7, 4, 2, 5, 8, 6, 3, 1.
Crearea arborelui binar
Crearea unui arbore binar alocat dinamic se realizează cel
mai uşor aplicând următoarea schemă:
- se generează un nod, adică se alocă spaţiu în heap şi se
încarcă informaţia;
- pentru fiecare nod se construieşte subarborele său stâng, apoi
subarborele său drept şi se completează adresele
descendenţilor nodului cu adresele acestor subarbori;
- un descendent vid trebuie marcat printr-o proprietate stabilită
asupra informaţiei (spre exemplu apariţia valorii 0 drept
conţinut informaţional al nodului curent).
Spre exemplu, pentru arborele binar prezentat în figură
şirul datelor furnizat la intrare va arăta astfel:

12407000350068000
ceea ce corespunde unei liste în preordine a nodurilor.
Parcurgere arbore binar
void RSD(ARB *r) //Parcurgere preordine void SRD(ARB *r) //Parcurgere inordine
{ {
if(r) if(r)
{ {
cout<<r->inf<<" "; RSD(r->st); RSD(r->dr); SRD(r->st); cout<<r->inf<<" "; SRD(r->dr);
} }
} }

void SDR(ARB *r) void Creare(ARB* &r) //Creare arbore binar


//Parcurgere postordine { int x; // x-informatie pentru subarbore
{ cin>>x;
if(r) if(!x) //urmeaza subarbore vid
{ r=0;
SDR(r->st); SDR(r->dr); else //Creare nod curent şi memorare informaţie
cout<<r->inf<<" "; { r=new ARB; r->inf=x;
} Creare(r->st); Creare(r->dr); } //Autoapelări
} }
Arbore binar de căutare (ABC)
 Un arbore binar de căutare este un arbore binar care trebuie să respecte
următoarele proprietăţi: pentru orice nod n, fiecare din descendenţii din
subarborele din stânga va avea valoarea informaţiei mai mică decât a nodului n, iar
fiecare din descendenţii din subarborele din dreapta va avea valoarea informaţiei
mai mare decât a nodului n.

Observaţie. O proprietate foarte importantă a ABC-ului este aceea că oferă posibilitatea


ordonării crescătoare a valorilor memorate în noduri prin parcurgerea arborelui în inordine.
Crearea şi inseratea într-un ABC
Crearea unui ABC se realizează adăugând intr-un arbore iniţial vid, pe rând,
câte un nod. Ideea este următoarea:
- dacă arborele este vid, se creează rădăcina;
- dacă arborele nu este vid, se compară informaţia noului nod cu informaţia din
nodul curent. Dacă este mai mare, se reia procesul pentru subarborele drept; dacă
este mai mică se reia procesul pentru subarborele stâng.
Funcţie ce adaugă un nod
într-un ABC
void Adauga(ABC* &r, int info)
// r-pointer la radacina arborelui;
{ if(!r) //arborele este vid, creez radacina
{ r=new ABC; r->inf=info; r->st=r->dr=0; }
else
if(info<r->inf) Adauga (r->st, info);
else if(info>r->inf) Adauga(r->dr, info);
else cout<<"\ninformatie dublicat\n";}
Căutarea unei informaţii
într-un ABC
Această operaţie se bazează pe ideea construcţiei arborelui. Se compară
informaţia cu cea din nodul curent. Dacă sunt egale, căutarea se încheie, dacă
nu, căutarea continuă în subarborele stâng sau în subarborele drept după cum
valoarea căutată este mai mică, respectiv mai mare decât informaţia din nodul
curent. În cazul în care se ajunge într-un subarbore vid (adresă nulă),
informaţia căutată nu se găseşte în ABC şi se afişează un mesaj.

void Cauta(ABC *p, int x)


{ if(!p)
cout<<"\ninformatia "<<x<<" nu exista in arbore\n";
else if(x<p->inf) Cauta(p->st, x);
else if(x>p->inf) Cauta(p->dr, x);
else cout<<"\ninformatia "<<x<<" exista in arbore\n";
}
Ştergerea unui nod dintr-un ABC
Cazul I
Dorim sa ștergem nodul 50. Acesta nu are subarbore
drept, așa ca îl vom înlocui pur si simplu cu nodul 20.
Ştergerea unui nod dintr-un ABC
Cazul II
Dorim sa ștergem nodul 150.
Subarborele drept nu conține decât nodul 175, nu exista un
subarbore stâng al subarborelui drept.
Se va înlocui nodul 150 cu 175
Ştergerea unui nod dintr-un ABC
Cazul III
Dorim să ștergem nodul 50.
Deoarece subarborele drept al nodului 50 conține un subarbore
stâng, se va alege cel mai din stânga nod al subarborelui drept a
lui 50. Acest cel mai din stânga nod va conține cel mai mic număr
mai mare decât nodul de șters. In cazul nostru acest nod este 66.
Sfârşit

S-ar putea să vă placă și