Documente Academic
Documente Profesional
Documente Cultură
6 aprilie 2022
20 45
10 26 37 57
20 45
10 26 37 57
10 26 37 57
7 null null 27 null null null null o frunză NIL se ı̂ntâlneşte acelaşi număr de
noduri negre (inclusiv frunza NIL şi exclusiv
null null null null nodul de la care se porneşte). Acest număr se
numeşte ı̂nălţimea neagră a subarborelui de
rădăcină x . Notăm ı̂nălţimea neagră cu bh -
black height.
30
20 45
Observaţii
Definirea unui nod NIL pentru fiecare frunză
presupune un consum inutil de memorie. Se
10 26 37 57 poate considera ı̂n locul acestor frunze un
singur nod santinelă T.nil.
7 27
null
30
Observaţii
Definirea unui nod NIL pentru fiecare frunză
20 45 presupune un consum inutil de memorie. Se
poate considera ı̂n locul acestor frunze un
singur nod santinelă T.nil.
10 26 37 57
Pentru simplitate ı̂n continuare vom ignora ı̂n
desene nodurile NIL.
7 27
Înălţimea neagră
23 23
11 45 11 31
5 14 25 59 5 14 26 45
9 0 7 12 20 24 28 38 52
27 30
a) b) 29
Înălţimea neagră
23 23
11 45 11 31
5 14 25 59 5 14 26 45
null null null null null null
null 9 0 7 12 20 24 28 38 52
null null 27 30
a) b) 29
11 45
5 14 25 null
null null
ARN - Inserţie
Etape
1 Inserţia noului nod ca la orice arbore binar de căutare
ARN - Inserţie
ARN - Inserţie
ARN - Inserţie
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.
Caz 1
B B
P U U P
Prorpietăţile RN trebuie refăcute dacă nodul inserat z
z z roşu se leagă de un părinte P roşu.
Caz 1
B Prorpietăţile RN trebuie refăcute dacă nodul inserat z
roşu se leagă de un părinte P roşu.
P U
Observaţie: s- a realizat inserţie ı̂ntr-un ARN valid
z ⇒ P nu e rădăcină ⇒ P are un părinte negru B.
3 4
2 3 1 2
Cazul II: Unchiul U al lui x este negru şi
a) z la dreapta lui P, iar P la stânga lui B
B soluție caz 3 B b) z la stânga lui P, iar P la dreapta lui B
b)
U P U z Soluţie:
ı̂n cazul a) - rotaţie la stânga după P.
1 2
z
1 2 3
P ı̂n cazul b) - rotaţie la dreapta după P
5
Nu se soluţionează complet, ci se trece practic ı̂n
3 4 4 5 cazul 3, ı̂n care refacerea ı̂ncepe de la nodul care
prin rotaţie a coborât, deci de la z = P.
4 5
caz 3
z.p.color ← negru
z.p.p.color ← rosu
ROT DR(T,z.p.p)
altfel (daca z.p e pe dreapta lui z.p.p)
//similar dar simetric pentru nodul z
//aflat la stânga bunicului
T .rad.color ← negru
RETURN
Inserţia presupune:
Algoritmul de inserarea ca la arborii binari de căutare obişnuiţi: complexitate
O(h), h ≤ 2 log2 (n + 1) ⇒complexitatea este O(log2 n).
Algoritmul de refacere al proprietăţilor RN: porneşte de jos ı̂nspre rădăcină pe o
ramură ⇒ complexitatea este O(log2 n).
Rexultă complexitatea totală: O(log2 n).
nod ∗ r a d ;
s t r u c t ARN{ nod ∗ n i l ;
s t r u c t nod { ARN( )
int info ; {
char c o l o r ; n i l = new nod ;
nod ∗ p , ∗ s t , ∗ d r ; nod−>c o l o r = ’ n ’ ;
nod ( i n t k e y = 0 ) nod−>p = n i l ;
{ nod−>s t = nod−>d r = n i l ;
i n f o = key ; rad = n i l ;
color = ’r ’ ; }
p = s t = dr = n u l l p t r ; // r e s t u l f u n c t i i l o r .
} // I n program NU mai e x i s t a NULL .
}; // Se i n l o c u i e s t e cu n i l
};
x NULL
z y
y
1 1 x [...] altfel
NULL x y = SUCCESOR(T , z)
color = y .color
x nodul santinelă x = y .dr
P P daca y .p = z atunci
x .p = y
z y altfel
y NULL
1 1 x
NULL NULL x
refacerea proprietăților RN începe de la x Arbori Roşu Negru
Noţiuni generale
Operaţii de inserţie şi ştergere
bh bh RB DELETE REPARE(T , x )
1 2 3 4 cat timp x 6= T .rad si x .color = negru
-colorez P roșu daca x = x .p.st atunci
-colorez F negru F = x .p.dr
-rotație la st după P F
// caz 1: fratele e rosu
bh
P daca F .color = rosu
4
bh-1 x F .color = negru
3
bh x .p.color = rosu
1 2 ROT ST(T , x .p)
F = x .p.dr
Se intră într-unul din
cazurile 2 - 4 sfarsit daca
bh-1 3 4 5 6
Caz 1: Sol:
-colorez P roșu
P
-colorez F negru
30 delete(12)
x F -rotație la st după P
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu 20 45
- continuă cu x = P
x F
=> reiau toate cazurile
FS FD
10 26 37 57
Caz 3 Sol:
P
-colorez F roșu
12 z 35 39 51 58
-colorez FS negru 7 27
x F
-rotesc dr. după F
FS FD => caz 4
1 9 17 x
Caz 4 Sol:
P -colorez F cu P.color
-colorez P, FD negru
x F -rotesc st. după P
FS FD
Caz 1: Sol:
P
-colorez P roșu
30 delete(12)
-colorez F negru
x F -rotație la st după P
=> caz 2, 3 sau 4
Caz 2:
PP
Sol: 20 45
- colorează F roșu
- continuă cu x = P
x F
=> reiau toate cazurile
FS FD
10 26 37 57
Caz 3
P
Sol:
-colorez F roșu 7 17 x 27 35 39 51 58
-colorez FS negru
x F
-rotesc dr. după F
FD => caz 4
1 9
FS caz 0
Caz 4 Sol:
P -colorez F cu P.color
-colorez P, FD negru
Sunrem ı̂n cazul 0 (x.color = rosu) ⇒
x F -rotesc st. după P colorăm x cu negru.
FS FD
Caz 1: Sol:
-colorez P roșu
P
-colorez F negru
30 delete(12)
x F -rotație la st după P
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu 20 45
- continuă cu x = P
x F
=> reiau toate cazurile
FS FD
10 26 37 57
Caz 3 Sol:
P
-colorez F roșu
-colorez FS negru 7 17 x 27 35 39 51 58
x F
-rotesc dr. după F
FS FD => caz 4
1 9
Caz 4 Sol:
P -colorez F cu P.color
-colorez P, FD negru
x F -rotesc st. după P
FS FD
Caz 1: Sol:
-colorez P roșu
P
-colorez F negru
30 delete(10)
x F -rotație la st după P
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu 20 45
- continuă cu x = P
x F
=> reiau toate cazurile
FS FD
10 z 26 37 57
Caz 3 Sol:
P
-colorez F roșu
7 17 y 27 35 39 51 58
-colorez FS negru
x F
-rotesc dr. după F
FS FD => caz 4
1 9
Caz 4 Sol: y=succesor(z)
P -colorez F cu P.color
-colorez P, FD negru
x F -rotesc st. după P
FS FD
Caz 1: Sol:
-colorez P roșu
P
-colorez F negru
30 delete(10)
x F -rotație la st după P
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu 20 45
- continuă cu x = P
x F
=> reiau toate cazurile P
FS FD
17 26 37 57
Caz 3 Sol:
P
-colorez F roșu
F 7 null x 27 35 39 51 58
-colorez FS negru
x F
-rotesc dr. după F
FS FD => caz 4
1 9 caz 1
Caz 4 Sol:
P -colorez F cu P.color
x F
-colorez P, FD negru
-rotesc st. după P
Suntem ı̂n cazul 1.
FS FD
Caz 1: Sol:
-colorez P roșu
P
-colorez F negru
30 delete(10)
x F -rotație la st după P
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu 20 45
- continuă cu x = P
x F
=> reiau toate cazurile P
FS FD
17 26 37 57
Caz 3 Sol:
P
-colorez F roșu
F 7 null x 27 35 39 51 58
-colorez FS negru
x F
-rotesc dr. după F
FS FD => caz 4
1 9 caz 1
Caz 4 Sol:
P -colorez F cu P.color
-colorez P, FD negru
x F -rotesc st. după P
FS FD
Caz 3
P
Sol: 1 17 x 27 35 39 51 58
-colorez F roșu
-colorez FS negru
x F
-rotesc dr. după F 9 null caz 0
FS FD => caz 4
Caz 4 Sol: null null
P -colorez F cu P.color
x F
-colorez P, FD negru x roşu ⇒ caz 0 ⇒ coloram x negru. STOP
-rotesc st. după P
FS FD
Caz 1: Sol:
-colorez P roșu
P
-colorez F negru
x F -rotație la st după P 30
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu
- continuă cu x = P 20 45
x F
=> reiau toate cazurile
FS FD
7 26 37 57
Caz 3 Sol:
P
-colorez F roșu
-colorez FS negru 1 17 27 35 39 51 58
x F
-rotesc dr. după F
FS FD => caz 4
9
Caz 4 Sol:
P -colorez F cu P.color
-colorez P, FD negru
x F -rotesc st. după P
FS FD
Caz 1: Sol:
-colorez P roșu
P
30 z
-colorez F negru delete(30)
x F -rotație la st după P
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu
- continuă cu x = P 20 45
x F
=> reiau toate cazurile
FS FD
7 26 37 57
Caz 3 Sol:
P
-colorez F roșu
-colorez FS negru 1 17 27 35 39 51 58
x F
-rotesc dr. după F
y = succesor(z)
FS FD => caz 4
9
Caz 4 Sol:
P -colorez F cu P.color
-colorez P, FD negru
x F -rotesc st. după P
FS FD
Caz 1: Sol:
-colorez P roșu
P
-colorez F negru delete(30)
x F -rotație la st după P 35
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu
- continuă cu x = P 20 45
x F
=> reiau toate cazurile
FS
P
FD
7 26 37 57
Caz 3 F
P
Sol: x
-colorez F roșu
x F
-colorez FS negru 1 17 27 null 39 51 58
-rotesc dr. după F
FS FD => caz 4 caz 2
9
Caz 4 Sol:
P -colorez F cu P.color
-colorez P, FD negru
x F -rotesc st. după P
FS FD
Caz 1: Sol:
-colorez P roșu
P
-colorez F negru delete(30)
x F -rotație la st după P 35
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu
- continuă cu x = P 20 45
x F
=> reiau toate cazurile x
FS FD
7 26 37 57
Caz 3 Sol:
P
-colorez F roșu
-colorez FS negru 1 17 27 null 39 51 58
x F
-rotesc dr. după F
FS FD => caz 4 caz 0
9
Caz 4 Sol:
P -colorez F cu P.color
-colorez P, FD negru
x F -rotesc st. după P
FS FD
Caz 1: Sol:
-colorez P roșu
P
-colorez F negru delete(30)
x F -rotație la st după P 35
=> caz 2, 3 sau 4
Caz 2:
Sol:
PP - colorează F roșu
- continuă cu x = P 20 45
x F
=> reiau toate cazurile
FS FD
7 26 37 57
Caz 3 Sol:
P
-colorez F roșu
-colorez FS negru 1 17 27 39 51 58
x F
-rotesc dr. după F
FS FD => caz 4
9
Caz 4 Sol:
P -colorez F cu P.color
-colorez P, FD negru
x F -rotesc st. după P
FS FD