Documente Academic
Documente Profesional
Documente Cultură
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";}