Sunteți pe pagina 1din 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 );
}

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

  • Arbori Optimali
    Arbori Optimali
    Document9 pagini
    Arbori Optimali
    Daniela Florina Luca
    Încă nu există evaluări
  • Arbori AVL
    Arbori AVL
    Document4 pagini
    Arbori AVL
    Daniela Florina Luca
    Încă nu există evaluări
  • Arbori 23
    Arbori 23
    Document5 pagini
    Arbori 23
    Daniela Florina Luca
    Încă nu există evaluări
  • Arbori B
    Arbori B
    Document4 pagini
    Arbori B
    Daniela Florina Luca
    Încă nu există evaluări
  • Arbori RB
    Arbori RB
    Document4 pagini
    Arbori RB
    Daniela Florina Luca
    Încă nu există evaluări