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