Sunteți pe pagina 1din 3

Structuri de Date

L A B O R A T O R

13a

Arbori AVL
Un arbore AVL este un arbore binar de cautare echilibrat in inaltime.
Pentru fiecare nod dintr-un arbore AVL inaltimea subarborelui stanga difera
de inaltimea subarborelui dreapta cu cel mult 1.
In fiecare nod p se memoreaza inaltimea sa, adica numarul de noduri de pe
cea mai lunga ramura care pleaca din nodul p.
Dupa adaugarea unui nou nod se verifica diferenta dintre inaltimile celor
doi subarbori la fiecare nod afectat de adaugare; daca aceasta diferenta este
mai mare ca 1 (in valoare absoluta) atunci se face o rotatie simpla sau dubla
pentru corectarea acestei diferente.
Sa se scrie:
1- Definitia unui tip "tnod" pentru un nod de arbore binar AVL care contine:
o valoare intreaga (val), inaltime nod (h), adrese noduri fii (st,dr).
O functie "make" pentru crearea unui nod frunza cu valoarea "val" si
inaltimea 1.
2- O functie recursiva pentru adaugarea unui nod nou la un arbore binar de
cautare,
cu modificarea inaltimilor nodurilor afectate de adaugare:
void add (tnod* & r, int x); // adauga x la arborele cu radacina r
3- O functie de afisare prefixata cu indentare, care marcheaza absenta unui
fiu
printr-un minus ('-'), dar nu si absenta ambilor fii (nodurile frunza nu sunt
urmate de '-'). Se va afisa valoarea si inaltimea fiecarui nod (intre
paranteze).
Exemplu de afisare dupa adaugarea valorilor 5,8,3,6,7
5(4)
3(1)
8(3)
6(2)
7(1)
Sa se verifice impreuna cu functia de adaugare "add" prin creare si afisare
arbore.
4- Functiile de rotatie a radacinii unui arbore la stanga (rotL) si la dreapta
(rotR), prin inlocuire cu fiul dreapta si respectiv cu fiul stanga. Prima
instructiune afiseaza litera 'L' sau 'R' si valoarea din nodul rotit
(radacina).
Sa se verifice rotind la stanga radacina arborelui (1(-,2(-,3)) si la dreapta
radacina arborelui (3(2(1,-),-))

5- Functiile de rotatie nod radacina, care modifica si inaltimile nodurilor


rotite:
rotL, rotR (rotatii simple la stanga si la dreapta)
Indicatie: in functia "rotL" se vor adauga urmatoarele linii:
r->h = 1+max( ht(r->st),ht(r->dr));
f->h = 1+max( ht(f->dr),r->h);

// inaltime r dupa rotatie


// inaltime f dupa rotatie

Functia urmatoare are ca rezultat inaltimea unui nod (memorata in nod):


int ht (tnod* r) { return r==NULL? 0 : r->h; }
6- Functii de rotatie dubla, pentru 3 noduri in zig-zag :
rotRL (tnod* p) // rotatie dreapta fiu dreapta p + rotatie stanga p
rotLR (tnod* p) // rotatie stanga fiu stanga p + rotatie dreapta p
Sa se verifice functia rotRL pe radacina arborelui (1(-,3(2,-)) si functia
rotLR
pe radacina arborelui (3(1(-,2),-))
7- O functie "main" care adauga si afiseaza succesiv arborele AVL rezultat
dupa adaugare, folosind functia de adaugare cu corectie "addFix".
Pentru verificare se va folosi secventa urmatoare care produce rotatii
simple
si duble: 5,4,1,7,8,6,2.
La fiecare pas se afiseaza valoarea adaugata, directia de rotatie, valoarea
nodului rotit (de ex: L5,R7,L4 ,..) si tot arborele.
Functia urmatoare face adaugarea si corectia necesara pentru arbori AVL:
void addFix ( tnod* & r, int x ) { // adauga x la arbore cu radacina r
if( r == NULL ) {
// daca arbore vid
r = make(x);
// creare nod frunza cu inaltimea 1
return;
}
if (x==r->val)
// daca x exista deja in arbore
return;
// atunci nu se mai adauga
if( x < r->val ) {
// daca x mai mic
addFix ( r->st,x );
// atunci se adauga la stanga
if( ht(r->st) - ht(r->dr) > 1 )// daca r dezechilibrat stanga
if( x < r->st->val )
// daca x e in fiul stanga
rotR( r );
// rotatie simpla la dreapta
else
// daca x e in fiul dreapta
rotLR( r );
// rotatie dubla stanga-dreapta
}
else {
//daca x mai mare
addFix ( r->dr,x );
// atunci se adauga la dreapta
if( ht(r->dr) - ht(r->st) > 1 ) // daca r dezechilibrat dreapta
if( x > r->dr->val ) // daca x e in fiul dreapta
rotL( r );
// rotatie simpla la stanga
else
// daca x e in fiul stanga
rotRL( r );
// rotatie dubla dreapta-stanga
}
r->h = max(ht(r->st), ht(r->dr)) + 1;
// recalculare inaltime nod r
}

8- Sa se rescrie functiile rotL, rotR, rotLR, rotRL si addFix fara a folosi


argumente referinta (functii cu rezultat tnod*) si sa se verifice cu functia
"main" de la programul anterior (modificata corespunzator).

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

  • 20.lab Intro 2c+
    20.lab Intro 2c+
    Document5 pagini
    20.lab Intro 2c+
    Leslie Nelson
    Încă nu există evaluări
  • CONTABILITATE Baze PDF
    CONTABILITATE Baze PDF
    Document20 pagini
    CONTABILITATE Baze PDF
    Leslie Nelson
    Încă nu există evaluări
  • Nikul
    Nikul
    Document1 pagină
    Nikul
    Leslie Nelson
    Încă nu există evaluări
  • Contabilitate Baze
    Contabilitate Baze
    Document74 pagini
    Contabilitate Baze
    Leslie Nelson
    Încă nu există evaluări
  • Nik
    Nik
    Document1 pagină
    Nik
    Leslie Nelson
    Încă nu există evaluări
  • Seminar 11
    Seminar 11
    Document14 pagini
    Seminar 11
    Leslie Nelson
    Încă nu există evaluări
  • Curs Online LBSTR Ro PDF
    Curs Online LBSTR Ro PDF
    Document12 pagini
    Curs Online LBSTR Ro PDF
    Sirghii Fiodor
    Încă nu există evaluări
  • Curs Online LBSTR Ro PDF
    Curs Online LBSTR Ro PDF
    Document12 pagini
    Curs Online LBSTR Ro PDF
    Sirghii Fiodor
    Încă nu există evaluări
  • Sanse
    Sanse
    Document1 pagină
    Sanse
    Leslie Nelson
    Încă nu există evaluări
  • Seminar 4
    Seminar 4
    Document5 pagini
    Seminar 4
    Leslie Nelson
    Încă nu există evaluări
  • Seminar 11
    Seminar 11
    Document14 pagini
    Seminar 11
    Leslie Nelson
    Încă nu există evaluări
  • Curs8 MC
    Curs8 MC
    Document22 pagini
    Curs8 MC
    Ervin Kovacs
    Încă nu există evaluări
  • Teste de Fizica 2012
    Teste de Fizica 2012
    Document6 pagini
    Teste de Fizica 2012
    Alex
    Încă nu există evaluări
  • Curs 1
    Curs 1
    Document7 pagini
    Curs 1
    Dragos Cristescu
    Încă nu există evaluări
  • Curs 8
    Curs 8
    Document16 pagini
    Curs 8
    Asavei Gianina
    Încă nu există evaluări
  • Cuprins 2
    Cuprins 2
    Document2 pagini
    Cuprins 2
    flowptz
    Încă nu există evaluări
  • L13 B
    L13 B
    Document3 pagini
    L13 B
    Leslie Nelson
    Încă nu există evaluări
  • Sanse
    Sanse
    Document1 pagină
    Sanse
    Leslie Nelson
    Încă nu există evaluări
  • Schem
    Schem
    Document1 pagină
    Schem
    Leslie Nelson
    Încă nu există evaluări
  • S4-Aproximari Polinomiale
    S4-Aproximari Polinomiale
    Document10 pagini
    S4-Aproximari Polinomiale
    Leslie Nelson
    Încă nu există evaluări
  • S4-Aproximari Polinomiale
    S4-Aproximari Polinomiale
    Document10 pagini
    S4-Aproximari Polinomiale
    Leslie Nelson
    Încă nu există evaluări
  • B Trees
    B Trees
    Document10 pagini
    B Trees
    Leslie Nelson
    Încă nu există evaluări
  • Introduce Re
    Introduce Re
    Document1 pagină
    Introduce Re
    flowptz
    Încă nu există evaluări
  • L13 A
    L13 A
    Document3 pagini
    L13 A
    Leslie Nelson
    Încă nu există evaluări
  • Capitolul 2
    Capitolul 2
    Document19 pagini
    Capitolul 2
    flowptz
    Încă nu există evaluări
  • L13 B
    L13 B
    Document3 pagini
    L13 B
    Leslie Nelson
    Încă nu există evaluări
  • L12 B
    L12 B
    Document4 pagini
    L12 B
    Leslie Nelson
    Încă nu există evaluări
  • L10 B
    L10 B
    Document3 pagini
    L10 B
    Leslie Nelson
    Încă nu există evaluări