Sunteți pe pagina 1din 6

Cod C++:

#include <iostream>

using namespace std;

///metoda cu alocare dinamica

struct nod
{int val;
nod *st,*dr;
};
nod *v;

int n,k;
///declaram o structura de tip nod

void inserare(nod *&v,int k)


{ if(v){ ///daca lista nu e vida
if(v->val==k) cout<<"Valoare inserata deja\n";
///daca valoarea exista deja in lista
else
if(v->val<k)
inserare(v->dr,k); ///daca valoarea e mai mare decat ceea ce se
gaseste la adresa lui c
else

inserare(v->st,k); ///daca valoarea e mai mic decat ceea ce se


gaseste la adresa lui c
}
else
{v=new nod;
v->val=k;
v->st=v->dr=0;} ///dava lista e vida o creeam
}

void srd(nod *v) ///parcurgere in inordine


{if(v) ///doar o lista nevida poate fi parcursa
{srd(v->st);
cout<<v->val<<" ";
srd(v->dr);
}
}

int cautare(nod *v,int k)


{if(v) {
if(v->val==k) ///daca valoarea coincide atunci e gasita
return 1;
else
if(v->val<k)

cautare(v->dr,k); ///cautam in subarborele drept


else
cautare(v->st,k);} ///cautam in subarborele stang
else
return 0;
}

void cmd(nod *&v,nod *&f)


{nod *aux;
if(f->dr)
cmd(v,f->dr); ///daca mai are subarbore la dreapta apelam aceasta
stergere mai speciala pt v si adresa de dreapata a lui f
else
{v->val=f->val;
aux=f;
f=f->st;
delete aux;
}
}

void sterg(nod *&v,int k)


{nod *aux,*f;
if(v){ ///pt o lista nevida

if(v->val==k){ ///daca am gasit valoarea


if(v->st==0 && v->dr==0) ///daca e nod terminal
{delete v;
v=0;
}
else
if(v->st==0)

///are numai subarbore drept

{aux=v->dr;
delete v;

///folosind un nod auxiliar stergem o legatura

v=aux;}
else
if(v->dr==0)

///are numai subarbore stang

{aux=v->st;
delete v;

///folosind un nod auxiliar stergem o legatura

v=aux;}
else
cmd(v,v->st); ///are ambii subarbori stang si drept
///apelam o stergere mai speciala pt nodul v si adresa de
stanga a acestuia
}

else
if(v->val<k)
sterg(v->dr,k); ///daca valoarea e mai mare decat ce se afla in v
mergem pe ramura dreapta
else
sterg(v->st,k); ///daca valoarea e mai mare decat ce se afla in v
mergem pe ramura stanga

else
cout<<"valoarea de sters nu se gaseste in arbore ";
}

int main()
{
cin>>n;
int i;
for(i=1;i<=n;i++)
{///inseram valorile din din arborele de cautare...il construim pas cu pas
cin>>k;
inserare(v,k);}
///afisam valorile din arbore in ordine crescatoare
srd(v);
///citim o valoare pt care sa facem cautare
cout<<endl<<"valoarea de cautat ";
cin>>k;
if(cautare(v,k))
cout<<"este!";
else
cout<<"nu este!";
///citim o valoare pe care sa o stergem
cout<<endl<<"valoarea de sters ";

cin>>k;
sterg(v,k);
///afisam din nou in ordine crecatoare componentele ramase
cout<<"arborele contine dupa stergere urmatoarele noduri\n ";
srd(v);
return 0;

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