Sunteți pe pagina 1din 10

Arbori Roşu-Negru

1. Introducere - Arbori binari de căutare

Definiţie: un arbore binar de căutare este un arbore binar cu următoarele proprietăţi.

 Toate nodurile din subarborele stâng al unui nod x au cheile mai mici decât cheia lui x.

 Toate nodurile din subarborele drept al unui nod x au cheile mai mari decât cheia lui x.

Exemplu de arbore binar de căutare

1.1 Operația de rotație

Rotaţia este o operaţie locală care schimbă ierarhia părinte-fiu a nodurilor dintr-un arbore
binar de căutare dar păstrează proprietăţile acestuia. Rotația este utilizată de exemplu pentru
echilibrarea arborilor roșu-negru.

Există rotație la dreapta în jurul unui nod și rotație la stânga în jurul unui nod. Aceste două
rotatii sunt ilustrate în figura de mai jos.

Observaţii:

 pentru a putea efectua o rotaţie spre dreapta în jurul nodului x, este necesar ca
subarborele stâng al lui x să fie nenul

 pentru a putea efectua o rotaţie spre stânga în jurul nodului y, este necesar ca
subarborele drept al lui x să fie nenul
1
Exemplu: În figura de mai jos este prezentat un exemplu de rotație la dreapta în jurul nodului
cu cheia 28 într-un arbore binar de căutare.

1.2. Căutarea binară a unei chei

Considerând un arbore T cu rădăcina T.rad să se determine nodul cu o cheie dată k.

Soluţie: la fiecare moment dat compar cheia nodului curent x, x.info, cu k. Dacă x.info = k
atunci se returnează nodul x. Dacă x.info<k atunci se continuă căutarea în subarborele drept,
altfel se continuă căutarea în subarborele stâng al lui x.

Algoritm:

CAUT_BIN(T,k)
x=T.rad
cât timp xNULL şi x.infok
dacă k<x.info atunci
x=x.st
altfel x=x.dr
sfârşit dacă
sfârşit cât timp
RETURN x

1.3. Inserarea unui nod

Considerăm arborele binar de căutare T cu rădăcina T.rad şi nodul z, cu

z.info = k, z.st = NULL, z.dr = NULL.

Se doreşte inserarea acestui nod în arborele binar T.

AB_INSERT(T,z)
y=NULL //va memora părintele nodului curent x
x=T.rad
cat timp xNULL
y=x

2
daca z.info < x.info atunci
x=x.st
altfel x=x.dr
sfarsit dacă
sfarsit cat timp
z.p=y
daca y=NULL atunci T.rad=z //inserarea radacinii
alfel //verific pe care parte se face inserţia
daca z.info < y.info atunci
y.st = z
altfel y.dr = z
sfarsit daca
sfarsit daca
RETURN

Exemplu: inserția succesivă a cheilor 7, 20, 1, 4, 9, 31, 14, 5 într-un arbore binar de căutare
inițial vid produce rezultatul prezentat în figura de mai jos.

Observaţii:

1. Complexitatea operaţiilor într-un arbore binar de căutare este proporţională cu


înălţimea arborelui. De fapt, dacă arborele conţine n noduri atunci dacă arborele este
echilibrat complexitatea este logaritmică, iar în cel mai defavorabil caz este liniară.

2. În cazul unui arbore binar de căutare oarecare nu poate fi garantată complexitatea


căutării binare, adică (log2n).

3. Există arbori binari care se auto-echilibrează, precum arborii roşu-negru prezentați în


acest capitol. În cazul acestor arbori complexitatea operaţiilor este O(log2n).

3
1.4. Parcurgerea unui arbore binar (de căutare).
 în adâncime: preordine (RSD), inordine (SRD) și postordine (SDR)
 în lățime (pe nivele)
Parcurgerile în adâncime diferă prin ordinea în care se parcurge un nod x față de cei doi
subarbori ai săi.
 RSD - întâi se parcurge nodul curent, apoi considerând aceeași ordine se parcurge
subarborele stâng al lui x și apoi subarborele drept al lui x.
 SRD - întâi se parcurge subarborele stâng al nodului curent x, apoi nodul x și în final
subarborele drept al lui x.
 SDR: - întâi se parcurge subarborele stâng al nodului curent x, apoi subarborele drept
al nodului x și la final se parcurge nodul x
Parcurgerea unui arbore binar de căutare în inordine (SRD) are ca rezultat șirul sortat al
cheilor existente în arbore. Pentru primul exemplu de arbore binar de căutare din acest capitol
parcuregerile sunt:
RSD: 38, 25, 10, 18, 11, 23, 53, 40, 39, 60, 55
SRD: 10, 11, 18, 23, 25, 38, 39, 40, 53, 55, 60
SDR: 11, 23, 18, 10, 25, 39, 40, 55, 60, 53, 38

2. Definiție și proprietăți ale unui arbore roșu-negru

2.1. Definiţie: Un arbore roşu-negru este un arbore binar de căutare în care fiecărui nod i se
asociază o culoare – roşu sau negru – şi care are următoarele proprietăţi:

1. Fiecare nod este roşu sau negru – are deci un câmp suplimentar culoare

2. Rădăcina este neagră

3. Fiecare frunză este neagră şi NULL

4. Dacă un nod este roşu, ambii descendenţi sunt negri  părintele unui nod roşu este
negru.

5. Pentru fiecare nod într-un arbore T oricare drum de la nod la o frunză (NULL) are
acelaşi număr de noduri negre (incluzând frunza NULL și excluzând nodul de la care
se pornește)  pe fiecare drum de la rădăcina T.rad la o frunză se găsește acelaşi
număr de noduri negre. Acest număr reprezintă înalţimea neagră a arborelui notată în
continuare cu bh(r) (black height).

4
Exemplu de arbore roșu-negru:

Observaţii:

 Într-un arbore roşu-negru nici un drum de la rădăcină la o frunză nu poate fi mai lung
decât dublul unui alt drum la altă rădăcină. Acest lucru asigură o oarecare balansare a
arborelui .

 Înălţimea maximă a unui arbore roşu-negru este 2log2(n+1).

Se demonstrează prin inducţie că orice subarbore de rădăcină x conţine cel puţin


2bh(x) - 1 noduri interne. Notând cu h înălţimea arborelui, din proprietatea 4 se obţine
bh(r)  h/2. Dar n  2bh(r)-1  2h/2-1 de unde rezultă h  2log2(n+1).

 Definirea unui nod NULL pentru fiecare frunză presupune un consum inutil de
memorie. Din acest motiv se poate considera în locul acestor frunze un singur nod
santinelă T.nil de care se leagă acele noduri interne care au ca descendenţi frunze
NULL.

Exemplu de arbore cu santinelă

 Pentru simplitate în continuare vom ignora în desene nodurile NULL.

5
 Operaţiile de căutare, maxim, minim, succesor, predecesor depind de înălţimea h a
arobrelui și se demonstrează că aceste operaţii au complexitatea (log2n).

 Operaţiile de inserţie şi ştergere sunt ceva mai complicate decât în cazul arborilor
binari de căutare simpli, deoarece după inserţie/ştergere trebuie eventual refăcută
structura de arbore roşu-negru.

Pentru refacerea proprietăţii de arbore roşu-negru sunt necesare operaţii de recolorare a


nodurilor şi de schimbare a relației părinte-fiu între noduri. Schimbarea acestei relații se
realizează prin operaţii de rotaţie.

2.2 Inserţia într-un arbore roşu-negru

Observaţii:

 Întotdeauna nodul care se introduce se colorează roşu

 Se utilizează o santinelă T.nil

 Inserţia se realizează ca în cazul arborilor binari de căutare obişnuiţi, după care se


apelează o funcţie de refacere a proprietăţilor de arbore roşu-negru

Proprietăţile care pot fi neîndeplinite în cazul inserţiei:

 Proprietatăţile 1, 3 şi 5 se păstrează, datorită faptului că se inserează un nod roşu, care


are ca descendenţi două frunze NULL, deci se leagă de nodul santinelă T.nil

 Proprietatea 2 poate fi contrazisă dacă nodul inserat este chiar rădăcina. În acest caz
este suficientă recolorarea nodului negru.

 Proprietatea 4 poate fi contrazisă, dacă părintele de care s-a legat noul nod are culoarea
roşie. În acest caz trebuie refăcută proprietatea. Există în această situaţie 3 cazuri care
vor fi discutate în continuare.

Refacerea a proprietăţilor RN este necesară doar dacă părintele nodului inserat este roşu.

Observaţii:

 Dacă notăm cu z nodul inserat (nodul curent), cu P părintele său, cu U unchiu (fratele
părintelui) iar cu B bunicul (părintele părintelui), atunci z se poate afla la stânga sau la
dreapta lui P. Cele două cazuri se tratează în mod similar, prin simetrie. Vom
considera în continuare inserţia pe stânga bunicului B.

 Datorită faptului că P este roșu înainte de inserţie, iar inserţia s-a produs într-un arbore
roşu-negru valid, înseamnă că P nu este rădăcină si deci există nodul B  T.nil

6
Cazurile de refacere a proprietăţii 4 în urma inserţiei

Cazu 1: unchiul lui z este roşu

Deoarece U, P sunt roşii rezultă că B are culoarea neagră (altfel s-ar contrazice proproietatea
4)  este suficientă recolorarea P, U, B, adică P şi U devin negri iar B roşu.

În urma acestei modificări poate avea loc o contrazicere a proprietăţii 4 pentru B şi părintele
său, deci se reia procedura de refacere a proprietăţilor roşu-negru pornind de la z = B.

Observaţie: Înălţimea neagră a arborelui nu se modifică.

Acelaşi procedeu se aplică şi în cazul în care z se află pe dreapta lui P sau dacă P și z se află la
dreapta lui B și U la stânga.

Cazul 2:

a) P se află la stânga lui B, unchiul este negru şi z se află la dreapta lui P

SAU

b) P se află la dreapta lui B, unchiul este negru și z se află la stânga lui P

Cazul 3:

a) P se află la stânga lui B, unchiul este negru şi z se află la stânga lui P

SAU

7
b) P se află pe dreapta lui B, unchiul este negru și z se află la dreapta lui P

Observaţie: printr-o rotaţie la stânga în jurul lui P, cazu 2 a) se reduce la cazul 3 a).

Cazul 3 a) se rezolvă în modul următor:

(1) Recolorare B, P.

(2) Rotaţie la dreapta în jurul lui B.

Se observă faptul că înălţimea neagră nu se modifică pe nici una dintre cele două ramuri

Așa cum s-a menționat, cazurile 2 b) și 3 b) se rezolvă în mod simetric cu 2 a) și 3 a).

Exemplu: construcţia unui ARN prin inserţii succesive ale cheilor 20, 40, 45, 36, 13, 19, 14, 2,
10

8
Algoritmii în pseudo-cod pot fi găsiți în bibliografia recomnadată.

Complexitate: Inserţia are complexitate (log2n) datorită faptului că este proporțională cu


înălțimea arborelui RN, iar aceasta este cel mult 2log2(n+1), iar algoritmul de refacere al
proprietăţilor de arbore roşu-negru porneşte de la nodul inserat și urcă cel mult până la
rădăcină (în cazul 1 se urcă), deci complexitatea este în cel mai defavorabil caz (log2n).
Rezultă complexitatea pentru inserţie este (log2n).

9
Probleme rezolvate tip examene de licență

Problema 1. Într-un arbore roşu-negru:

a. Ambii descendenţi ai unui nod negru sunt întotdeauna roşii


b. Cel puţin un descendent al unui nod negru este întotdeauna roşu
c. Părintele unui nod negru este întotdeauna roşu
d. Nici una dintre afirmaţiile de mai sus nu este adevărată

Răspuns corect: d.

Explicație: în definiția unui arbore roșu-negru se specifică faptul ca descendenții unui nod
roșu sunt întotdeauna negri. Despre descendenții nodurilor negre nu se fac afirmații. Rezultă
că un nod negru poate avea atât descendenți roșii cât și negri. De asemenea un nod negru
poate avea și numai descendenți negri. Rezultă și că părintele unui nod negru poate fi negru.
Astfel nici una dintre afirmațiile a, b sau c nu este adevărată.

Problema 2. Într-un arbore roșu negru valoarea maximă a raportului dintre numărul de noduri
roșii și numărul total de noduri interne (adică fără frunzele nil) este:

a. 1/2

b. 2/3

c. 2

d. 1

Răspuns corect: b

Explicație: Valoarea maximă a raportului dintre numărul de noduri roșii și numărul de noduri
interne se obține atunci când fiecare nod intern negru are doi descendenți roșii. În acest caz
numărul de noduri roșii este de două ori mai mare decât numărul de noduri negre interne.
Cum suma numărului de noduri roșii și a numărului de noduri negre interne este chiar
numărul de noduri interne, rezultă faptul că numărul de noduri roșii este 2/3 din numărul total
de noduri interne, deci valoarea raportului este cea dată la punctul d.

Bibliografie recomandată:

10

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