You are on page 1of 4

Ambele rotatii se executa in O(1).

Prin rotaie se modifica doar pointerii, celelalte


campuri raman aceleasi.
Pseudocodul pentru Roteste-stanga(T,x) presupune dreapta[x]!=null

1. y=dreapta[x]
2. dreapta[x]=stanga[y]
3. daca(stanga[y]!=null) atunci
4. p[stanga[y]]=x
5. p[y]=p[x]
6. daca(p[x]=null) atunci
7. radacina[T]=y
8. altfel
9. daca(x=stanga[p[x]]) atunci
10. stanga[p[x]]=y
11. altfel
12. dreapta[p[x]]=y
13. stanga[y]=x
14. p[x]=y

2. Inserarea unei chei

Inserarea unui nod intr-un arbore rosu-negru avand n noduri se poate realiza
intr-un timp O(lg n). Se va utiliza la inceput procedura de inserare intr-un arbore
binar de cautare pentru a insera un nod x in arborele T considerand ca T este un
arbore binar de cautare obisnuit si apoi il vom colora pe x cu rosu. Pentru a garanta
conservarea proprietatilor rosu-negru, vom reface arborele rezultat prin recolorarea
nodurilor si efectuarea de rotatii. Majoritatea codului algoritmului RN-Insereaza
gestioneaza diversele cazuri ce pot apare in timpul refacerii proprietatilor rosu-
negru pentru arborele rezultat in urma executiei algoritmului de inserare intr-un
arbore binar de cautare oarecare.
In urma inserarii singura proprietate care poate fi distrusa este proprietatea 3,
care afirma ca un nod colorat cu rosu nu poate avea un fiu colorat si el cu rosu. Mai
exact, proprietatea 3 este incalcata daca parintele lui x este rosu, deoarece x este
colorat si el astfel.
Pseudocodul pentru RN-Insereaza(T,x) este

1. //insereaza x in arbore binar de cautare


2. culoare[x]=rosu
3. cat timp x!=radacina[T] si culoare[p[x]]=rosu exeuta
4. daca p[x]=stanga[p[p[x]]] atunci
5. y=dreapta[p[p[x]]]
6. daca culoare[y]=rosu atunci
7. culoare[p[x]]=negru
8. culoare [y]=negru
9. culoare p[p[x]]=rosu
10. x=p[p[x]]
11. altfel
12. daca x=dreapta[p[x]] atunci
13. x=p[x]
14. Roteste-stanga(T,x)
15. culoare[p[x]]=negru
16. culoare[p[p[x]]]=rosu
17. Roteste-dreapta(T,p[p[x]])
18. altfel
19. (La fel ca in clauza atunci interschimband "dreapta" cu "stanga')
20. culoare[radacina[T]]=negru

Exista sase cazuri care trebuie considerate in ciclul cat timp, insa 3 dintre ele
sunt simetrice celorlalte 3, in functie de cum parintele lui x, p[x] este fiu stang sau
drept al bunicului p[p[x]] al lui x, lucru care se determina in linia 4. S-a presupus ca
radacina arborelui este neagra deci p[x] nu este radacina arborelui si p[p[x]] exista.
Cazul 1(liniile 7-10) se executa cand p[x] si x sunt colorati cu rosu. Deoarece
p[p[x]] este negru, atat x cat si p[x] se pot colora cu negru, rezolvand conflictul ca
p[x] si x sunt rosii si apoi vom colora p[p[x]] cu rosu pentru a conserva proprietaeta
4. Daca p[p[x]] are la randul sau un parinte colorat cu rosu repetam ciclul cat
timp cu p[p[x]] pe post de x.
In cazurile 2 si 3, culoarea unchiului y al lui x este neagra. Cele 2 cazuri cazuri
se deosebesc prin faptul ca x este fiu drept, respectiv stang al lui p[x]. In cazul
2(liniile 13-14) x este fiu drept al parintelui sau. Printr-o rotatie stanga, acest caz se
transforma in cazul 3(liniile 15-17) in care x este fiu stang al parintelui sau.
Deoarece x si p[x] sunt rosii, rotatia nu afecteaza inaltimea neagra a nodurilor, nici
proprietatea 4. In cazul 3 se executa 2 schimbari de culoare si o rotatie la dreapta
care conserva proprietatea 4 si deoarece nu mai avem noduri consecutive rosii, am
terminat. Timpul de executie a procedurii este O(lg n).

3. Stergerea unei chei

La fel ca si celelalte operatii de baza pe un arbore rosu-negru cu n noduri,


stergerea unui nod consuma un timp O(lg n). Stergerea unui nod dintr-un arbore
rosu-negru nu este cu mult mai complicata decat inserarea unui nod intr-un astfel
de arbore.
Pentru a face mai simple conditiile la limita din cod, vom folosi o santinela
pentru a reprezenta null. Pentru un arbore rosu-negru T, santinela nil[T] este un
obiect cu campul culoare negru, iar celelalte campuri - p, stanga, dreapta si cheie -
setate la valori arbitrare.
Pseudocodul pentru RN-Sterge(T,z) este urmatorul

1. daca stanga[z]=nil[T] sau dreapta[z]=nil[T] atunci


2. y=z
3. altfel
4. y=Succesor(z)
5. daca stanga[y]!=nil[T] atunci
6. x=stanga[y]
7. altfel
8. x=dreapta[y]
9. p[x]=p[y]
10. daca p[x]=nil[T] atunci
11. radacina[T]=x
12. altfel daca y=stanga[p[y]] atunci
13. stanga[p[y]]=x
14. altfel
15. dreapta[p[y]]=x
16. daca y!=z atunci
17. cheie[z]=cheie[y]
18. daca culoare[y]=negru atunci
19. RN-Sterge-Repara(T,x)
20. returneaza y

Dupa eliminarea nodului din arbore, RN-Sterge apeleaza o procedura


ajutatoare RN-Sterge-Repara care schimba culorile si efectueaza rotatiile necesare
conservarii proprietatilor rosu-negru. Nodul x transmis procedurii RN-Sterge-
Repara este nodul care a fost unicul fiu al lui y inainte ca y sa fie eliminat, daca y a
avut un fiu diferit de nil sau santinela nil[T] in cazul cand y nu a avut fii.
Pseudocodul pentru RN-Sterge-Repara(T,x) este:

1. cat timp x!=radacina[T] si culoare[x]=negru executa


2. daca x=stanga[p[x]] atunci
3. w=dreapta[p[x]]
4. daca culoare[w]=rosu atunci
5. culoare[w]=negru
6. culoare[p[x]]=rosu
7. Roteste-stanga(T,p[x])
8. w=dreapta[p[x]]
9. daca culoare[stanga[w]]=negru si culoare[dreapta[w]]=negru atunci
10. culoare[w]=rosu
11. x=p[x]
12. altfel
13. daca culoare[dreapta[w]]=negru atunci
14. culoare[stanga[w]]=negu
15. culoare[w]=rosu
16. Roteste-dreapta(T,w)
17. w=dreapta[p[x]]
18. culoare[w]=culoare[p[x]]
19. culoare[p[x]]=negru
20. culoare[dreapta[w]]=negru
21. Roteste-stanga(T,p[x])
22. x=radacina[T]
23. altfel
24. (La fel ca in clauza atunci interschimband "dreapta" cu "stanga')
25. culoare[x]=negru

Daca nodul y eliminat in RN-Sterge este negru, stergerea lui are ca efect
micsorarea cu 1 a numarului de noduri negre de pe fiecare drum care a continut
acest nod. Prin urmare, proprietatea 4 nu este respectata pentru toti stramosii
nodului y. Acest inconvenient se poate corecta considerand ca nodul x are un
"negru suplimentar" sau este "dublu colorat cu negru". Cu alte cuvinte, daca
adaugam 1 la numarul de noduri colorate cu negru de pe orice drum care il contine
pe x, atunci in interpretarea de mai sus, proprietatea 4 este verificata. Exista 8
cazuri care pot apare insa 4 dintre ele sunt simetrice celorlalte 4, in functie de cum
x este fiu stang sau drept al parintelui p[x].
Cazul 1(liniile 5-8) apare cand nodul w, fratele nodului x, este colorat cu rosu.
Deoarece w trebuie sa aiba fii colorati cu negru, putem interschimba culorile lui w
si p[x] si apoi sa efectuam o rotatie la stanga in p[x] fara a incalca nici una dintre
poprietatile rosu-negru.
Cazurile 2,3 si 4 apar cand nodul w este colorat cu negru; ele se deosebesc prin
culorile fiilor lui w. In cazul 2(liniile 10-11) ambii fii ai lui w sunt colorati cu
negru. Deoarece si w este colorat cu negru, vom "scoate afara un negru" atat de la x
cat si de la w, lasand x numai cu un negru, punand w pe rosu si adaugand un negru
suplimentar la p[x], care va deveni "dublu colorat cu negru" prin eliminarea
negrului suplimentar din fiul sau. Corpul ciclului cat timp se poate repeta cu p[x]
pe post de nod x.
Cazul 3(liniile 14-17) apare cand w este colorat cu negru, fiul sau stang este
rosu, iar fiul drept este negru. Putem interschimba culorile lui w si ale fiului sau
stang si apoi sa efectuam o rotatie la dreapta in w fara a incalca proprietatile rosu-
negru.
Cazul 4(liniile 18-22) apare cand w este colorat cu negru, iar fiul drept al lui w
este rosu. Efectuand anumite schimbari de culoare si apoi o rotatie la stanga in p[x],
se poate elimina "negrul suplimentar" din x fara a incalca proprietatile rosu-negru.
Setarea lui x ca radacina provoaca terminarea ciclului cat timp cand se testeaza
conditia de continuare a ciclarii.
Deoarece inaltimea unui arbore rosu-negru avand n noduri este O(lg n), costul
total al procedurii este O(lg n).

You might also like