You are on page 1of 3

Arborii de cutare cu noduri colorate ("Red Black Trees") realizeaz un bun

compromis ntre gradul de dezechilibru al arborelui si numrul de operatii


necesare pentru mentinerea acestui grad. Un arbore RB are urmtoarele
proprietti:

- Orice nod este colorat fie cu negru fie cu rosu.

- Fiii (inexistenti) ai nodurilor frunz se consider colorati n negru

- Un nod rosu nu poate avea dect fii negri

- Nodul rdcin este negru

- Orice cale de la rdcin la o frunz are acelasi numr de noduri negre.

Se consider c toate frunzele au ca fiu un nod sentinel negru. De observat c


nu este necesar ca pe fiecare cale s alterneze noduri negre si rosii. Consecinta
acestor proprietti este c cea mai lung cale din arbore este cel mult dubl
fat de cea mai scurt cale din arbore; cea mai scurt cale poate avea numai
noduri negre, iar cea mai lung are noduri negre si rosii care alterneaz. O
definitie posibil a unui nod dintr-un arbore RB:

typedef struct tnod {

int val; //date din nod

char color; // culoare nod (N sau R)

struct tnod *st, *dr;

} tnod;

tnod sentinel = { NIL, NIL, 0, N, 0}; // santinela este un nod negru

#define NIL &sentinel // adresa memorata in nodurile frunza

Functiile de corectie arbore AA sunt foarte simple:

skew elimin o legtur la stnga pe orizontal printr-o rotatie la dreapta;

void skew ( tnod * & r ) {

if( r st niv == r niv ) rotR(r);


}

split elimin dou legturi orizontale succesive pe dreapta, prin rotatie la


stnga a nodului cu fiu si nepot pe dreapta;

void split( tnod * & r ) {

if( r dr dr niv == r niv ) {

rotL( r ); r niv++;

In functia urmtoare corectia se face imediat dup adugarea la un subarbore


si de aceea se pot folosi rotatiile scurte aplicabile numai unui nod rdcin:

// adaugare nod cu valoarea x la arbore AA cu radacina r

void add( tnod * & r , int x ) {

if( r == NIL ) { // daca (sub)arbore vid

r = new tnod; // aloca memorie pentru noul nod

r val=x;r niv= 1; // valoare si nivel nod nou

r st = r dr= NIL; // nodul nou este o frunza

return;

if (x==r val) return; // daca x era deja in arbore, nimic

if( x < r val ) // daca x mai mic ca valoarea din r

add( r st, x ); // adauga x in subarborele stanga al lui r

if( x > r val ) // daca x este mai mare ca valoarea din r

add( r dr, x ); // adauga x la subarborele dreapta

skew( r ); // corectii dupa adaugare

split( r );
}

You might also like