You are on page 1of 8

Arbori binari de cautare.

Stergerea unui nod



Dupa stergere arborele trebuie sa ramana de cautare.

Fie valoarea 80 a nodului care urmeaza a fi sters. Intervin urmatoarele situatii:
1. nodul care urmeaza a fi sters este nod terminal caz in care se face
stergerea (se elibereaza zona de memorie si adresa se inlocuieste cu 0)
ceea ce inseamna ca parintele acestuia va avea adresa catre el inlocuita cu
0.











Rezulta:







. nodul care urmeaza a fi sters subordoneaza un singur subarbore! cel
drept! caz in care parintelui sau i se va inlocui adresa catre el cu adresa
subarborelui drept respectiv
















Rezulta:


















". nodul care urmeaza a fi sters subordoneaza un singur subarbore! cel
stang! caz in care parintelui sau i se va inlocui adresa catre el cu adresa
subarborelui stang respectiv
#. nodul care urmeaza a fi sters subordoneaza doi subarbori caz in care se
procedeaza astfel:






























$%in locul& informatiei nodului sters va trece cea mai mare valoare din
subarborele sau stang.
'ceasta valoare se gaseste la cel mai din dreapta nod din subarborele stang.




























Fie acest nod (f. Fiind cel mai din dreapta inseamna ca acesta va subordona cel
mult un subarbore stang. 'dresa acestui subarbore %va trece in locul& lui f.





























)a rezulta:
























* solutie de implementare este:


void cmd(nod( +c!nod( +f)
,nod (au-.
if(f$/dr)
cmd(c!f$/dr).
else
,c$/nr0o1f$/nr0o.
au-1f.
f1f$/st.
delete au-.
2
2

void sterg(nod (+c!int 3)
,nod (au-!(f.
if(c)
if(c$/nr0o113)
if(c$/st110++c$/dr110) //daca e nod terminal
,delete c.
c10.
2
else
if(c$/st110) //are numai subordonat drept
,au-1c$/dr.
delete c.
c1au-.2
else
if(c$/dr110) //are numai subordonat drept
,au-1c$/st.
delete c.
c1au-.2
else
cmd(c!c$/st). //are ambii subordonati

else
if(c$/nr0o43)
sterg(c$/dr!3).
else
sterg(c$/st!3).

else
cout445valoarea de sters nu se gaseste in arbore 5.
2


void main()
,int i!n!a.
cout445nr. de noduri 5.
cin//n.
for(i11.i41n.i66)
,cout445valoarea de inserat 5.
cin//a.
inserare(v!a).
2
cout44endl445arborele contine urmatoarele noduri 544endl.
svd(v).
cout44endl445valoarea de sters 5.
cin//a.
sterg(v!a).
cout44endl445arborele contine dupa stergere urmatoarele noduri 544endl.
svd(v).
getc7().
2