Sunteți pe pagina 1din 54

ARBORI ROŞU-NEGRI.

• În capitolul anterior am arătat că operaţiile


de căutare, predecesor, succesor,
minimum, maximum, inserarea, şi
ştergerea pentru un arbore binar de
căutare cu înălţimea h se fac în O(h). Deci
aceste operaţii se execută rapid dacă
înălţimea este mică; dar, dacă înălţimea
este mare, performanţele lor nu pot fi mai
bune decât ale unei lisle înlănţuite.
• Arborii roşu-negri sunt una din multele
scheme de arbori de căutare care sunt
“aproape echilibraţi” cu scopul de a
garanta ca operaţiile dinamice să aibă
complexitatea O(lg n).
• Un arbore roşu-negru este un arbore binar
care conţine căte o informaţie în plus
pentru fiecare nod aceasta fiind culoarea
care poate fi roşu sau negru. Arborii roşu-
negrii ne asigură că nu există o cale cu
lungimea de două ori mai mare decât orice
altă cale, deci aceşti arbori sunt
aproximativ echilibraţi.
• Fiecare nod al arborelui roşu-negru
conţine următoarele câmpuri:
• culoarea (CuI)
• cheia (KEY)
• legătura din stânga (LS)
• legătura din dreapta (LD)
• părintele (P)
• Un arbore binar de căutare este arbore roşu-
negru dacă îndeplineşte următoarele proprietăţi:
• 1.Fiecare nod este roşu sau negru
• 2.Fiecare frunză Nil este neagră
• 3.Dacă un nod este roşu, atunci ambii
descendenţi sunt negri
• 4.Pe orice cale între un nod şi o frunză
descendentă se află acelaşi număr de noduri
negre.
• Lema
• Un arbore roşu-negru cu n noduri interne
are înălţimea cel mult 2*log(n+ 1).
Consecinţă
• Operaţiile dinamice căutare, minimum,
maximum, succesor, predecesor pot fi
implementate pentru arborii roşu-negri în
O(lg n).
• Operaţiile de inserare şi ştergere aplicate
unui arbore roşu-negru cu n chei modifică
arborele, ceea ce ar putea duce la
distrugerea proprietăţilor pe care trebuie
să le aibă un arbore roşu-negru. Pentru a
restaura aceste proprietăţi va trebui sa
schimbăm culoarea anumitor noduri şi,
deasemenea, să schimbăm structura
pointer.
• Schimbăm structura pointer printr-o
rotaţie, care este o operaţie locală într-un
arbore de căutare care conservă disciplina
cheilor.
• Când facem o rotaţie stânga presupunem
că LD(y)Nil. Rotatia_stânga “pivotează”
în jurul legăturii dintre x şi y, făcându-l pe y
noua rădăcina a subarborelui având pe x
ca şi descendent stâng, iar descendentul
stâng al lui y va fi descendentul drept al lui
x. (,,, sunt subarbori arbitrari).
• Rotaţie_stânga(T ,x)
• y=LD(x)
• LD(x)=LS(y)
• Daca LS(y) Nil atunci
• P(LS(y))=x
• sdaca
• P(y)=P(x)
• Daca P(x)=Nil atunci
• Rad(T)=y
• altfel
• Daca x = LS(P(x)) atunci
• LS(P(x))=y
• altfel
• LD(P(x))=y
• sdaca
• LS(y)=x
• P(x)=y
• sdaca
• Return

Ambii algoritmi au complexitatea O(1). În
figură se vede cum funcţionează
• Vom folosi algoritmul INS_BIN din cursul
anterior. Pentru a insera un nod x în
arborele T ca şi cum ar fi un arbore binar
de căutare oarecare apoi îl vom colora
roşu.
• Pentru a garanta că proprietăţile roşu-
negru sunt păstrate vom ‘repara’
modificările apărute în arbore prin
recolorarea nodurilor şi folosirea rotaţiilor
Căutarea

• Datorită regulii care ordonează cheile nodurilor,


căutarea unei chei începe prin compararea cheii
date cu cea stocată în rădăcina arborelui:
- dacă ele sunt egale atunci s-a găsit valoarea
căutată,
- dacă valoarea dată este mai mică decât cea a
rădăcinii atunci continuăm căutarea în
subarborele stâng, altfel în subarborele drept.
- dacă se ajunge la o frunză şi valoarea căutată nu
a fost găsită înseamnă că ea nu se află printre
valorile cheilor arborelui.
Minim şi maxim
• Pentru a determina minimul sau maximul cheilor
din nodurile unui arbore binar de căutare vom
folosi tot proprietatea acestuia. Pentru
determinarea minimului vom porni de la ideea că
în rădăcină se păstrează minimul şi atâta timp
cât această are legătură stângă voi reiniţializa
minimul cu valoarea cheii din legătura stângă,
altfel spus nodul din arborele stâng aflat pe cea
mai la stânga poziţie va conţine cheia minimă.
Maximul se va găsi în arborele drept pe cea mai
din dreapta poziţie.
Succesor şi predecesor
• Pentru a determina succesorul unui nod este suficient să
determinăm minimul din subarborele său drept, iar
pentru predecesor să determinăm maximul din
subarborele său stâng.
Inserarea
• Datorită regulii care ordonează valorile din noduri
inserarea unei valori noi printre valorile stocate deja în
nodurile unui ABC începe prin compararea valorii date
cu cea stocată în rădăcina arborelui:
• dacă valoarea dată este mai mică decât cea a rădăcinii
atunci continuăm compararea în subarborele stâng până
când ajungem la frunză care permite valorii date să-i
devină fiu, în cel mai rău caz se poate ajunge la o frunză
de pe ultimul nivel
• altfel se continuă compararea în subarborele drept.
• Comparaţiile pe care trebui să le executaţi pentru a
insera nodul cu valoarea 15 în arborele de mai jos
Ştegerea

Ştergerea se face în funcţie de numărul de fii ai


nodului care urmează a fi şters:
- Dacă nodul de şters nu are copii el se şterge
pur şi simplu
Exemplu ştergeţi nodul 16 în arborele construit
anterior
• Dacă nodul are un fiu se şterge nodul şi se înlocuieşte
cu fiul. Exemplu ştergeţi nodul 45
• Dacă nodul are doi fii atunci se şterge nodul şi se înlocuieşte cu
succesorul – nodul cu cea mai mică valoare din subarborele drept
(sau cu predecesorul – nodul cu cea mai mare valoare din
subarborele stâng ). Exemplu ştergeţi rădăcina arborelui
Exemplu Un arbore roşu-negru
Inserare
•Această operaţie strică proprietăţile iniţiale
ale arborelui. Algoritmul are la bază
algoritmul de la ABC cu convenţia ca nodul
inserat să aibă culoarea roşie.
Există două situaţii de bază în care ne vom
afla când inserăm un nod într-un ARN
1) părintele nodului de inserat este negru
situaţie pe care o vom numi NR şi care se
rezolvă la fel ca la ABC
• Inseraţi nodul 14 în ARN-ul iniţial
• părintele nodului de inserat este roşu situaţie pe care o vom numi RR
şi care se rezolvă mai complicat pentru că încalcă proprietatea 4.
Dacă am încerca rezolvarea problemei prin recolorarea nodului
inserat în negru am încălca proprietatea 6.
• Rezolvarea încălcărilor de proprietăţi se face după locul nodului
inserat faţă de viitorul său părinte. Astfel:
• dacă nodul inserat este pe partea stângă a părintelui său ne va
interesa culoarea unchiului său adică fratele părintelui
–dacă unchiul este roşu atunci nodul inserat nu va încălca proprietatea
6 pentru că nodurile roşii nu contează la înălţimea neagră a ARN, în
această situaţie, pe care o vom numi S-RRr, vom recolora părintele şi
unchiul şi bunicul nodului de inserat procedură care va mări cu o
unitate înălţimea neagră dar poate produce alte încălcări ale
proprietăţilor ARN
• Exemplu. La inserarea nodului 21 în arborele
dat iniţial suntem exact în situaţia descrisă
mai sus 21 =LS(P(21)), cul(P(21))=cul(22)=R,
cul(U(21))=cul(27)=R ceea ce înseamnă că va
trebui să recolorăm pe 22, 27 şi 25. Observaţi
că problema nu s-a rezolvat definitiv ci a
urcat mai sus făcând ca nodul 25 să încalce
proprietatea 3. Rezolvarea se va face cu
cazul potrivit pentru nodul bunic..
• Cazul S-RRr impune recolorarea părintelui unchiului şi bunicului în
cazul nostru se vor recolora 22, 27 şi 25
• Am ajuns într-o situaţie nediscutată încă şi
anume D-RRr (nodul care încalcă proprietăţile
ARN este fiu roşu pe dreapta a unui părinte
roşu şi are unchiul roşu)
b) dacă unchiul este negru, situaţie pe care o vom
numi S-RRn atunci se vor face două rotaţii: la
dreapta după părinte respectiv la stânga după
bunicul nodului inserat (sau nodul care a
generat încălcarea proprietăţilor) urmată de o
recolorare.
• Inserarea lui 5 în arborele iniţial
generează situaţia S-RRn pentru că
unchiul lui 5 este o frunză nil care este
întotdeauna neagră
Recapitulare:
• http://www.ece.uc.edu/~franco/C321/html/
RedBlack/redblack.html
Ştergerea

• a) Cazul în care nodul de şters este roşu şi are copii frunze nil
• Exemplu ştergerea nodului 27 din arborele iniţial se face natural
• b) Cazul în care nodul are un singur copil el va fi sigur negru
• Exemplu ştergerea lui 1 în arborele iniţial
• c) Cazul în care nodul care trebuie şters are doi copii iar
predecesorul sau succesorul său este un nod roşu
• În arborele de mai jos rădăcina are succesorul roşu. (14)
• După ştegere arborele va fi

• În aceste cazuri ştergerea nu încalcă niciuna din proprietăţile ARN şi se


execută la fel ca la ABC.
– Nodul de şters este negru şi are copii doar
frunze nil
• a) Dacă este legătură stînga pentru
părintele său executăm:
- recolorarea părintelui şi a subarobrelui
drept având ca rădăcină fratele nodului
şters,
- o rotaţie spre stânga după părintele
nodului şters
• Exemplu Ştergeţi nodul 15 din arborele iniţial
• Recolorarea subarborelui
• Rotaţia stânga după 17
• b) Dacă este legătură dreapta pentru părintele
său executăm:
- ştergerea nodului,
- recolorarea părintelui şi a subarobrelui drept
având ca rădăcină fratele nodului şters,
- o rotaţie spre stânga după frate
- o rotaţie dreapta după parinte
Exemplu Ştergeţi nodul 11 din arborele iniţial
– Nodul de şters este negru, are doi copii iar
predecesorul sau succesorul sunt şi ei negri.
• Se înlocuieşte nodul de şters cu
succesorul sau predecesorul său care se
va şterge conform unuia din cazurile în
care nodul are un copil sau nu are copii.
• Exemplu Ştergerea rădăcinii 13 folosind
succesorul în arborele iniţial
• RN_INSERT(T ,x)
• Cheama INS_BIN(T ,k,x)
• Cul(x)=roşu
• Atat timp cat xRad(T) şi cul(P(x))=roşu
• daca P(x) = LS(P(P(x)) atunci
• y= LD(P(P(x))
• daca Cul(y)=roşu atunci
• Cul(P(x))=negru
• Cul(y)=negru
• Cul(P(P(x))=roşu
• x=P(P(x))
• altfel
• daca x=LD(P(x)) atunci
• x=P(x)
• cheama Rotaţie_stânga(T,x)
• sdaca
• Cul(P(x))=negru
• Cul(P(P(x)) = ro:u
• Cheama Rotaţie_dreapta(T ,P(P(x))
• Sdaca
• (aceleaşi instrucţiuni ca pe ramura dreaptă unde LD şi LS au fost schimbate)
• Cul(Rad(T))=negru
• return
• Care dintre proprietăţile roşu-negru sunt
încălcate după primele două linii ale
algoritmului? Proprietatea 1 se păstrează cu
siguranţă, la fel şi cea de-a doua din moment ce
noul nod introdus este roşu şi descendentul sau
este Nil. Proprietatea 4 este satisfacută pentru
că nodul x înlocuieşte un nod negru - Nil şi acest
nod x este roşu cu descendent Nil. Deci singura
proprietate care poate fi ‘stricată’ este cea cu
numarul 3 (în cazul în care părintele lui x este
roşu).
• În figură este dat un exemplu care arată
cum este încalcată această proprietate
după ce un nod x este inserat. La celelalte
subpuncte ale figurii sunt prezentaţi paşii
algoritmului care ‘repară’ această
încălcare.

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