Sie sind auf Seite 1von 23

Arbori binari de cautare

echilibrati (AVL)

1
Arbori binari de cautare (BST)
Structuri de date ce implementeaza conceptul de dictionar

rad = radacina
SAS = SubArbore Stang
SAD = SubArbore Drept

SAS < rad < SAD


Operatii elementare:
Insert
Search/Find
Delete
2
Arbori binari de cautare (BST)
h – adancimea arborelui
N – nr. maxim de noduri dintr-un arbore binar

N = 2h – 1

n – nr. efectiv de noduri


n ≤ N => n ≤ 2h – 1 => log2n ≥ h

Operatii elementare:
Insert  O(log2n)
Search/Find – max. h comparatii  O(log2n)
Delete  O(log2n)
Daca arborele este echilibrat!

3
Arbori binari de cautare (BST)
12

Daca arborele este dezechilibrat..


16

21 Cazul cel mai defavorabil: h ≈ n


32

Operatii elementare:
Insert  O(n)
Search/Find – max. h comparatii  O(n)
Delete  O(n)

4
Arbori binari de cautare (BST)
AVL - Adelson-Velsky and Landis
AVL echilibrati
Obiectiv: rescrierea operatiilor Insert si Delete astfel incat:

• sa pastreze arborele echilibrat

• sa ramana in O(log n)
Arbore echilibrat:
|h(SAS) – h(SAD)| <= 1

5
Arbori binari de cautare (BST)
AVL echilibrati
Se aplica rotatii pentru a conserva echilibrul

Fie - un nod al arborelui

- un subarbore de adincime h

- un subarbore de adincime h-1

6
Arbori binari de cautare (BST)
AVL echilibrati
La inserarea unui nod X apar 4 situatii posibile care necesita aplicarea
unei rotatii

7
Arbori binari de cautare (BST)
AVL echilibrati
La inserarea unui nod X apar 4 situatii posibile care necesita aplicarea
unei rotatii

8
Arbori binari de cautare (BST)
AVL echilibrati: Rotatii simple - la dreapta

Situatia initiala Situatia finala


9
Arbori binari de cautare (BST)
AVL echilibrati: Rotatii simple - la stanga

Situatia initiala Situatia finala


10
Arbori binari de cautare (BST)
AVL echilibrati: Rotatii duble

Detaliem T2: ad (t2s) = ad (t2d) = h-1

11
Arbori binari de cautare (BST)
AVL echilibrati: Rotatii duble - la dreapta

Situatia initiala Situatia finala


12
Arbori binari de cautare (BST)
AVL echilibrati: Rotatii duble - la dreapta = 2 rotatii simple RSD(B) + RSS(A)

Situatia initiala Prima rotatie simpla A doua rotatie simpla


(la stanga pt. B) (la dreapta pt. A)
13
Arbori binari de cautare (BST)
AVL echilibrati: Rotatii duble - la stanga = RSD(B) + RSS(A)

Situatia initiala Situatia finala


14
Arbori binari de cautare (BST)
AVL echilibrati:

typedef int Atom;

struct AVL {
Atom data;
char bf; //balance factor = h(stg)-h(drt)
AVL *stg, *drt;
};

15
Arbori binari de cautare (BST)
AVL echilibrati:
EqRequired  variabila globala

InsertAVL(rad, x) MakeNodAVL(x)
p := get_space_AVL()
if rad = 0 then data(p) := x
rad := MakeNodAVL(x) stg(p) := 0
EqRequired := true drt(p) := 0
else
if x < data(rad) then bf(p) := 0
InsertAVL(stg(rad), x) return p
Echilibrare(rad, x, true)
else
if x > data(rad) then
InsertAVL(drt(rad), x)
Echilibrare(rad, x, false)
end-if
end-if
end-if
16
Arbori binari de cautare (BST)
AVL echilibrati:
La revenirea din recursie in functia InsertAVL se incearca echilibrarea fiecarui nod de
pe ramura ce uneste nodul inserat cu radacina, daca este nevoie

Functia Echilibrare
• actualizeaza factorii de echilibru pentru toate nodurile de pe ramura, pana la radacina
sau pana la intalnirea unui nod critic
• echilibreaza nodul critic, prin rotatii simple/duble, daca este nevoie (daca inserarea
nu l-a echilibrat)

17
Arbori binari de cautare (BST)
AVL echilibrati:
Nod critic = primul nod cu bf ≠ 0 in parcurgerea de la nodul inserat spre
radacina (echivalenta cu revenirea din recursie in functia de inserare)

In urma inserarii toate nodurile de pe ramura, aflate mai jos decat nodul
critic, vor capata factor de dezechilibru ±1.
Perturbatia nu se propaga mai sus de nodul critic deoarece:
• daca dezechilibrul nodului critic este de acelasi sens cu dezechilibrul creat prin inserare,
se aplica o rotatie in urma careia nodul va fi echilibrat si adancimea subarborelui care
porneste din nodul critic ramane egala cu adancimea dinainte de inserare;
• daca dezechilibrul nodului critic este de sens opus celui creat prin inserare, ele se
anuleaza, adancimea subarborelui ramanand deasemenea neschimbata.

18
Arbori binari de cautare (BST)
AVL echilibrati:
Echilibrare(a, x, stg) stg  indica unde s-a facut inserarea valorii x
stg = true  la stanga nodului a
if EqRequired = true then stg = false  la dreapta nodului a
if stg = true then
switch bf(a)
case 1: //adancimea pe SAS era mai mare  rotatie dreapta
EqRequired := false //resetare flag
if x < data(stg(a)) then
RSD(a) //rotatie simpla la dreapta
else
RDD(a) //rotatie dubla la dreapta
end-if
case 0: //nu exista dezechilibru inainte de inserare
bf(a) := 1 //dar s-a produs acum
case -1: //adancimea pe SAD era mai mare
bf(a) := 0 //inserarea a produs echilibru
EqRequired := false
else //inserarea s-a facut la dreapta  DE COMPLETAT
………
end-if
end-if
19
Arbori binari de cautare (BST)
AVL echilibrati:

RSS(a) //a - transmis prin referinta


b := drt(a)
drt(a) := stg(b)
stg(b) := a O(1)
bf(a) := 0
bf(b) := 0
a := b //b devine noua rad

20
Arbori binari de cautare (BST)
AVL echilibrati:
RDD(a)
b := stg(a)
c := drt(b)
//se actualizeaza bf pentru starea finala:
if bf(c) = 0 then
//h(t2s)=h(t2d) inainte de refacerea legaturilor
bf(a) := bf(b) := 0 // inserarea va echilibra
else if bf(c) = -1 then
//h(t2s)<h(t2d), initial, inainte de refacerea legaturilor
O(1) bf(a) := 0 // deoarece h(T3)=h(t2d)
bf(b) := 1 // deoarece h(T1)> h(t2s)
else if bf(c) = 1 then
//h(t2s)>h(t2d), initial, inainte de refacerea legaturilor
bf(a) := -1 // deoarece h(t2d)< h(T3)
bf(b) := 0 // deoarece h(T1)=h(t2s)
//se efectueaza rotatia:
stg(a) := drt(c)
drt(b) := stg(c)
bf(c) := 0
drt(c) := a
stg(c) := b
a := c
21
Arbori binari de cautare (BST)
AVL echilibrati:
Echilibrare(a, x, stg) stg  indica unde s-a facut inserarea valorii x
stg = true  la stanga nodului a
if EqRequired = true then stg = false  la dreapta nodului a
if stg = true then
switch bf(a)
case 1: //adancimea pe SAS era mai mare  rotatie dreapta
EqRequired := false //resetare flag (a – nod critic)
if x < data(stg(a)) then
RSD(a) //rotatie simpla la dreapta
else
RDD(a) //rotatie dubla la dreapta
end-if
case 0: //nu exista dezechilibru inainte de inserare
bf(a) := 1 //dar s-a produs acum
case -1: //adancimea pe SAD era mai mare
bf(a) := 0 //inserarea a produs echilibru
EqRequired := false //resetare flag (a – nod critic)
else //inserarea s-a facut la dreapta  DE COMPLETAT
………
end-if
end-if
22
Arbori binari de cautare (BST)
AVL echilibrati:

https://www.cs.usfca.edu/~galles/visualization/AVLtree.html

23

Das könnte Ihnen auch gefallen