Sunteți pe pagina 1din 6

Arborele binar de căutare

Definiție: Se numește arbore binar de căutare un arbore binar care are


proprietatea că, pentru fiecare nod, cheia din succesorul stâng este mai mică decât
cheia din nod, iar cheia din succesorul drept este mai mare decât cheia din nod.
Operațiile principale, care se pot efectua asupra unui arbore binar de căutare sunt:
-crearea arborelui;
-adăugarea unui nod la arbore
-căutarea unui nod în arbore
-listarea informațiilor nodurilor arborelui
-ștergerea unui nod al arborelui
Structura nodurilor poate fi:
struct nod
{
int cheie;
nod *st, *dr;
};
Crearea și adăugarea
Crearea unui arbore binar de căutare se face aplicând de un număr de ori operația
de adăugare.
Presupunem că vrem să adăugăm un nod cu cheia val, la un arbore binar de căutare
cu rădăcina c. Acest lucru se realizează utilizând funcția adaugă caracterizată
astfel:
-are 2 parametrii:
c- radacina arborelui binar de căutare în care se face adăugarea
val-cheia nodului care se dorește adăugat
și procedează astfel:
-dacă nodul c există (c!=NULL)
- se compară cheia nodului c cu cheia val
-dacă cheia nodului c este egală cu cheia val se afișeaza mesajul ”Nodul
exista”
- dacă cheia nodului c > decât cheia val se reia procesul de adăugare
în subarborele stâng (se aplica funcția adaugă asupra subarborelui cu rădăcina c-
>st)
- dacă cheia nodului c este mai mică decât cheia val se reia procesul
de adăugare în subarborele drept(se aplică funcția adaugă asupra subarborelui cu
rădăcina c->dr)
Altfel
- Se alocă spațiu pentru noul nod c;
- Se incarcă informația
- Se stabilesc legăturile cu descendenții săi (c->st=NULL, c->dr=NULL)

Căutarea
Presupunem că vrem să căutăm un nod cu cheia val într-un arbore binar de căutare
care are rădăcina c. Acest lucru se poate face folosind funcția caută caracterizată
astfel:
- Are 2 parametrii:
-c rădăcina arborelui în care se face căutarea
- val – cheia nodului care se caută
și procedează astfel:
- Dacă nodul c există
-se compară cheia nodului c cu cheia val
- daca cheia nodului c este egală cu cheia val se afișează
mesajul ” Nodul există”
- dacă cheia nodului c este mai mare decât cheia val se reia
procesul de căutare în subarborele stâng(se aplică funcția caută asupra
subarborelui cu rădăcina c->st)
-dacă cheia nodului c este mai mică decât cheia val se reia
procesul de căutare în subarborele drept(se aplică funcția caută asupra
subarborelui cu rădăcina c->dr)
-altfel
-se afișează mesajul Nu exista nodul căutat
void adaugare(nod *&c,int val)
{
if(c!=NULL)
if(c->cheie==val) cout<<"Nodul exista";
else
if(c->cheie>val)
adaugare(c->st,val);
else
adaugare(c->dr,val);
else
{
c=new nod;
c->cheie=val;
c->st=NULL;
c->dr=NULL;
}
}
Listarea
Se poate face folosind metodele de parcurgere ale arborilor binari: parcurgerea in
preordine, inordine, postordine
void preordine (nod void inordine(nod *c) if(c!=NULL)
*c) { {postordine(c-
{ if(c!=NULL) >st);
if(c!=NULL) {inordine(c->st); postordine(c->dr);
{ cout<<c- cout<<c-
cout<<c- >cheie<<" "; >cheie<<" ";
>cheie<<" "; inordine(c->dr);} }
preordine(c->st); } }
preordine(c->dr);} Void postordine(nod
} *c)
{

Ștergerea
Presupunem că dorim să ștergem un nod cu cheia val dintr-un arbore binar de
căutare cu rădăcină. Acest lucru se realizează folosind funcția șterge caracterizată
astfel:
-are 2 parametrii:
- c- rădăcina arborelui în care se face ștergerea
- val – cheia nodului care se dorește șters
și procedează astfel:
1. Dacă nodul c există
- Se compară cheia nodului c cu cheia val, se pot întâlnii situațiile:
a. Dacă cheia nodului c este egală cu cheia val
-dacă nici subarborele drept și nici cel drept nu există, se face ștergerea
având grijă ca la părintele lui să înlocuim adresa către el cu NULL
-dacă subarborele stâng nu există, se face ștergerea având grijă ca la
părintele lui să înlocuim adresa către el cu adresa subarborele său drept
-dacă subarborele drept nu există, se face ștergerea având grijă ca la
părintele lui să înlocuim adresa către el cu adresa subarborelui său stâng
-dacă subarborele stâng și cel drept există se determină cel mai din
dreapta nod al subarborelui stâng al nodului care urmează să fie
șters(acest nod se șterge fizic)
- cheia și celelalte informații din nodul care se șterge fizic se mută în
nodul care se șterge logic
-subarborele stâng al nodului care se șterge fizic se leagă:
-în stânga nodului care se șterge logic(dacă nodul care se
șterge fizic este descendent direct al nodului care se șterge logic)
-în dreapta tatălui care se șterge fizic(altfel)
-se șterge fizic nodul care a fost identificat cel mai în dreapta în
subarborele stâng al nodului cu cheia val.
b. Dacă cheia nodului c este mai mare decât cheia val se reia proceul de
ștergere în subarborele stâng(se aplică funcția șterge asupra subarborelui cu
rădăcina c->st)
c.Dacă cheia nodului c este mai mică decât cheia val se reia procesul de
ștergere în subarborele drept(se aplică funcția șterge asupra subarborelui cu
rădăcina c->dr)
2. Dacă nodul c nu există se afiseaza mesajul ”Nu exista nodul”
void celmaidindreapta(nod *&c,nod *&d)
{nod *urm;
if(d->dr!=NULL) celmaidindreapta(c,d->dr);
else
{
c->cheie=d->cheie;
urm=d;
d=d->st;
delete urm;
}}
void stergere(nod *&c,int val)
{
nod *urm;
if(c!=NULL){
if(c->cheie==val)
{
if(c->st==NULL && c->dr==NULL)
{
delete c;
c=NULL;
}
else
if(c->st==NULL)
{
urm=c->dr;
delete urm;
c=urm;
}
else
if(c->dr==NULL)
{
urm=c->st;
delete urm;
c=urm;
}
else celmaidindreapta(c,c->st);
}
else
if(c->cheie>val)
stergere(c->st,val);
else
stergere(c->dr,val);
}
else
cout<<"Nu exista nodul";}

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