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:
2. 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:
3. 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
4. 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.
Aceasta 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. Adresa acestui subarbore „va trece in locul” lui f.
Va rezulta:
O solutie de implementare este:
void cmd(nod* &c,nod* &f)
{nod *aux;
if(f->dr)
cmd(c,f->dr);
else
{c->nr_o=f->nr_o;
aux=f;
f=f->st;
delete aux;
}
}
void sterg(nod *&c,int k)
{nod *aux,*f;
if(c)
if(c->nr_o==k)
if(c->st==0&&c->dr==0) //daca e nod terminal
{delete c;
c=0;
}
else
if(c->st==0) //are numai subordonat drept
{aux=c->dr;
delete c;
c=aux;}
else
if(c->dr==0) //are numai subordonat drept
{aux=c->st;
delete c;
c=aux;}
else
cmd(c,c->st); //are ambii subordonati
else
if(c->nr_o<k)
sterg(c->dr,k);
else
sterg(c->st,k);
else
cout<<"valoarea de sters nu se gaseste in arbore ";
}
void main()
{int i,n,a;
cout<<"nr. de noduri ";
cin>>n;
for(i=1;i<=n;i++)
{cout<<"valoarea de inserat ";
cin>>a;
inserare(v,a);
}
cout<<endl<<"arborele contine urmatoarele noduri "<<endl;
svd(v);
cout<<endl<<"valoarea de sters ";
cin>>a;
sterg(v,a);
cout<<endl<<"arborele contine dupa stergere urmatoarele noduri "<<endl;
svd(v);
getch();
}