You are on page 1of 4

ARBORI DE CAUTARE

8.1 ARBORI BINARI DE CUTARE

Un arbore binar de cutare (BST=Binary Search Tree), numit si arbore de


sortare sau arbore ordonat, este un arbore binar cu proprietatea c orice nod
interior are valoarea mai mare dect orice nod din subarborele stnga si mai
mic dect orice nod din subarborele dreapta. Arborii BST permit mentinerea
datelor n ordine si o cutare rapid a unei valori si de aceea se folosesc pentru
implementarea de multimi si dictionare ordonate. Afisarea infixat a unui arbore
de cutare produce un vector ordonat de valori.

Intr-un arbore ordonat, de cutare, este important ordinea memorrii


succesorilor fiecrui nod, deci este important care este fiul stnga si care este
fiul dreapta. Valoarea maxim dintr-un arbore binar de cutare se afl n nodul
din extremitatea dreapt, iar valoarea minim n nodul din extremitatea stng.
Cutarea unei chei ntr-un arbore binar de cutare este asemntoare cutrii binare:
cheia cutat este comparat cu cheia din nodul curent (iniial nodul rdcin). n funcie
de rezultatul comparaiei apar trei cazuri:
acestea coincid > elementul a fost gsit
elementul cutat este mai mic dect cheia din nodul curent > cutarea continu
n subarborele stng
elementul cutat este mai mare dect cheia din nodul curent cutarea continu
n subarborele drept
Inserarea unui nod se face, n funcie de rezultatul comparaiei cheilor, n subarborele
stng sau drept. Dac arborele este vid, se creeaz un nod care devine nodul rdcin al
arborelui. n caz contrar, cheia se insereaz ca fiu stng sau fiu drept al unui nod din
arbore.
tergerea unui nod este o operaie puin mai complicat, ntruct presupune o
rearanjare a nodurilor. Pentru eliminarea unui nod dintr-un arbore binar de cutare sunt
posibile urmtoare cazuri:
nodul de ters nu exist operaia se consider ncheiat
nodul de ters nu are succesori este o frunz
nodul de ters are un singur successor
nodul de ters are doi succesori
n cazul tergerii unui nod frunz sau a unui nod avnd un singur successor, legtura de
la printele nodului de ters este nlocuit prin legtura nodului de ters la succesorul su
(NULL n cazul frunzelor).
Eliminarea unui nod cu doi succesori se face prin nlocuirea sa cu nodul care are cea mai
apropiat valoare de nodul ters. Acesta poate fi nodul din extremitatea dreapt a
subarborelui stng (predecesorul) sau nodul din extremitatea stnga a subarborelui
drept (succesorul). Acest nod are cel mult un successor.

struct nod
{int nr_o;
nod*st,*dr;
};

nod *v;
int n,k;

void inserare(nod *&c,int k)


{if(c)
if(c->nr_o==k)
cout<<"nr deja inserat "<<endl;
else
if(c->nr_o<k)
inserare(c->dr,k);
else
inserare(c->st,k);

else
{c=new nod;
c->nr_o=k;
c->st=c->dr=0;}
}

void svd(nod *c) //parcurgere in inordine


{if(c)
{svd(c->st);
cout<<c->nr_o<<" ";
svd(c->dr);
}
}

int cautare(nod *c,int k)


{if(c)
if(c->nr_o==k)
return 1;
else
if(c->nr_o<k)
cautare(c->dr,k);
else
cautare(c->st,k);
else
return 0;
}
Stergere :
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 ";
}