Sunteți pe pagina 1din 7

1.

Arbori binari 1 -----------------------------------------------------------------------------------------------------------------------

Unitatea de nvare Nr. 1


ARBORI BINARI Cuprins
Obiectivele unitii de nvare nr. 1......................................................................................5 1.1. Necesitatea utilizarii arborilor binari...............................................................................5 1.2. Un exemplu de parcurgere a unui arbore binar.............................................................5 1.3. Ce este un cod prefixat ?...............................................................................................5 1.4. Comentarii i rspunsuri la testele de autoevaluare......................................................5 1.5. Lucrare de verificare pentru studeni..............................................................................5 1.6. Bibliografie......................................................................................................................5

Obiectivele Unitii de nvare nr. 1

Dup ce vei parcurge aceast unitate de nvare, vei reui s: Intelegeti notiunea de arbore binar,modul de reprezentare si posibilitatile de parcurgere; Utilizati arborii binari inseilati pentru parcurgerea mai rapida a arborilor binari si gasirea succesorilor/predecesorilor unor noduri; Utilizati algoritmul lui Huffman pentru construirea unor coduri prefixate optime

1.1. Necesitatea utilizarii arborilor binari


In multe situatii utilizarea listelor liniare in alocarea secventiala sau inlantuita (simplu sau dublu),care pot functiona ca stive (ultimul intrat-primul iesit) sau cozi (primul intratprimul iesit) nu este suficienta.Cel mai simplu caz de structuri de date neliniare il constituie arborii binari,care se pot defini recursiv in modul urmator : -arborele vid este un arbore binar ; -un arbore binar nevid este alcatuit din radacina si un subarbore stang si un subarbore drept,care la randul lor sunt arbori binari. Daca ambii subarbori binari ai radacinii sunt nevizi,radacinile lor se mai numesc fiii radacinii,iar cei doi fii se numesc frati. 1 ------------------------------------------------------------------------------------------------------------------Structuri de date si tehnici de programare

2 Arbori binari ----------------------------------------------------------------------------------------------------------------------Arborii binari se pot reprezenta in felul urmator : fiecare nod este reprezentat printr-un camp INFO care contine informatia memorata in acel nod,precum si prin doua alte campuri LLINK si RLINK,care contin pointeri catre adresele radacinilor subarborilor stang,respectiv drept (L de la left si R de la right).Daca unul dintre acestia este vid, campul de legatura respectiv va fi reprezentat prin lambda. Un arbore binar se numeste strict daca fiecare nod are zero sau doi fii ; nodurile cu zero fii se numesc frunze sau noduri terminale. Arborii binari se utilizeaza pentru reprezentarea expresiilor aritmetice ; in radacina unui arbore apare ultimul operator (operatie) efectuata de acea expresie,iar subarborii stang,respectiv drept reprezinta cele doua expresii carora li se aplica acest operator. In acest fel in frunze apar operanzii (variabilele si constantele),iar in nodurile interne operatorii expresiei. Vom vedea ca arborii binari se utilizeaza pentru reprezentarea unor algoritmi de sortare si de cautare (regasire a informatiei),operatii care apar frecvent in bazele de date. Structura de arbore binar se poate transforma intr-o structura liniara in urma parcurgerii sau traversarii arborelui,adica a vizitarii nodurilor sale intr-o anumita ordine,rezultand un sir de noduri. Tipurile principale de parcurgeri sunt urmatoarele : -traversarea in preordine sau in ordinea RSD (radacina-stanga-dreapta) : se viziteaza intai radacina,subarborele ei stang si apoi subarborele drept,in aceeasi ordine ; -traversarea in inordine sau in ordinea simetrica SRD (stanga-radacina-dreapta) : se viziteaza intai subarborele stang,radacina si subarborele drept; -traversarea in postordine SDR (stanga-dreapta-radacina) : se viziteaza subarborele stang,apoi subarborele drept si la final radacina. Aceste definitii sunt recursive ; daca arborele este vid,nu se executa nimic. Pentru traversarea unui arbore binar se poate utiliza o stiva,ca in urmatorul exemplu :

1.2. Un exemplu de parcurgere a unui arbore binar


Exemplul 1 Urmatorul algoritm traverseaza un arbore binar in ordinea simetrica folosind o stiva auxiliara A ; accesul la arbore se face printr-un pointer T care memoreaza adresa radacinii arborelui ;daca arborele este vid,atunci T=lambda. 1. Se face stiva A vida si P T. 2. Daca P=lambda, se merge la pasul 4. 3. Se depune valoarea lui P in stiva A, P A.Apoi P
LLINK(P) si se merge la pasul 2.

4. Daca stiva A este vida,algoritmul se termina ; altfel se


scoate varful stivei si se atribuie lui P : P A.

5. Se viziteaza nodul NOD(P). Apoi se face P RLINK(P) si se


merge la pasul 2.

Daca se face vizitarea nodului NOD(P) la pasul 3,inainte de depunerea valorii lui P in stiva,se obtine un algoritm pentru vizitarea arborelui in ordinea RSD. Deoarece in reprezentarea cu legaturi LLINK si RLINK a unui arbore binar multe campuri sunt lambda,adica nu contin nicio informatie utila,se poate utiliza o reprezentare insailata a arborelui.Daca insailarea se face relativ la 2 ------------------------------------------------------------------------------------------------------------------Structuri de date si tehnici de programare

1. Arbori binari 3 ----------------------------------------------------------------------------------------------------------------------ordinea simetrica,atunci daca LLINK(P)=lambda ea se va inlocui cu adresa predecesorului nodului NOD(P) relativa la ordinea simetrica,iar daca RLINK(P)= lambda,atunci vom defini RLINK(P) ca fiind egal cu adresa succesorului nodului NOD(P) relativ la aceeasi ordine.Pentru a distinge legaturile de insailare de cele obisnuite vom folosi un camp de un singur bit in fiecare nod,care va avea valoarea TAG(P)=1 daca legatura este obisnuita si TAG(P)=0 daca legatura a fost creata prin insailare. Sa mai observam ca este necesara prezenta unui nou nod care sa joace rolul unui nod cap de lista si la care sa mearga lagatura de insailare stanga a primului nod,respectiv legatura de insailare dreapta a ultimului nod al arborelui in ordinea simetrica.Radacina arborelui poata fi gasita in campul LLINK al acestui nod,a carui adresa trebuie memorata printr-un pointer T. In felul acesta unele operatii asupra arborelui pot fi simplificate,de exemplu gasirea succesorului simetric al lui NOD(P) intr-un astfel de arbore,care poate fi gasit facand o parcurgere partiala a unui drum din arbore,fara a mai folosi o stiva auxiliara.

1.3. Ce este un cod prefixat?


Frunzele unui arbore binar pot fi puse in corespondenta cu cuvinte binare peste alfabetul M cu doua simboluri,0 si 1 : plecand din radacina arborelui,de fiecare data cand ne deplasam la stanga scriem 0 si cand ne deplasam la dreapta scriem 1.Lungimea unui cuvant binar asociat unei frunze,adica numarul sau de litere este egal cu lungimea drumului de la radacina la acea frunza,care mai este egal cu numarul de nivel al frunzei respective,nivelul radacinii fiind egal cu 0 (se presupune ca arborele este desenat cu radacina sus si frunzele jos,pe nivelele cele mai mari). Multimea cuvintelor de cod asociate frunzelor unui arbore binar formeaza un asa numit cod prefixat (sau instantaneu),care are proprietatea ca niciun cuvant de cod nu este inceput propriu al celuilalt. Aceasta se justifica prin aceea ca nicio frunza nu este nici descendent si nici stramos al altei frunze in arbore. Daca un sir de litere este format prin concatenarea cuvintelor dintr-un astfel de cod,decodificarea se poate face usor citind sirul de la stanga la dreapta si marcand un cuvant de fiecare data cand el este recunoscut. De exemplu,pentru codul care consta din cuvintele 00,01,100,101,11, sirul 000110110100 se descompune imediat,de la stanga la dreapta in 00,01,101,101,00. Ne vom ocupa de constructia unui arbore binar care este optim intr-un sens care va fi precizat ulterior,prezentand problema ca o problema de comunicatie optima,context in care a fost rezolvata de Huffman in anul 1950.Insa aceasta metoda de optimizare se aplica de asemenea in sortarea externa,in cautare,in comprimarea fisierelor etc. Sa presupunem ca trebuie sa transmitem L mesaje printr-un canal de comunicatie care transfera literele din alfabetul 0,1 cate una intr-o unitate de timp.Sa mai presupunem ca aceste mesaje apar unul dupa altul cu probabilitatile p_1,p_2,,p_L,iar urmatorul mesaj care trebuie transmis apare cu aceste probabilitati,independent de mesajele precedente. 3 ------------------------------------------------------------------------------------------------------------------Structuri de date si tehnici de programare

4 Arbori binari ----------------------------------------------------------------------------------------------------------------------Vrem sa gasim un cod prefixat w_1,w_2,,w_L peste alfabetul M,pentru care notand vectorul lungimilor acestor cuvinte prin (l_1,l_2, ,l_L),lungimea medie p_il_i sa fie minima.In aceasta formula s-a notat cu l(w_i)=l_i lungimea (numarul de litere) ale cuvantului w_i. Algoritmul lui Huffman construieste un arbore T optim plecandu-se cu o multime V formata din n frunze ,v_1,,v_n carora li se asociaza ponderile w_1,,w_n pentru 1in si cu o multime I de noduri interne ; I este initial multimea vida.Variabila k,initial egala cu 0 este un contor care numara nodurile interne construite pana in acel moment. Algoritmul se scrie astfel :
while k<n-1 do se selecteaza nodurile x_1 si x_2 din I U V cu cea mai mica pondere;se construieste un nou nod intern x cu ponderea egala cu suma ponderilor celor doua noduri x_1 si x_2 si se adauga x la multimea nodurilor interne I,se face kk+1 ; se elimina nodurile x_1 si x_2 din I U V

od ntrebare: Care sunt proprietatile arborilor optimi care justifica algoritmul lui Huffman?

Rspuns:

1. Daca w_i<w_j atunci nivelul frunzei v_i in orice arbore optim este mai mare sau egal cu nivelul frunzei v_j; 2. Exista un arbore optim in care frunzele cu cele mai mici ponderi sunt frati. Folosindu-se aceste doua proprietati se poate demonstra prin inductie dupa n,numarul de ponderi,ca algoritmul lui Huffman construieste un Exemplul 3 arbore optim (care liste circulare este unic),considerand multimea de Serializarea unei in general nu ponderi {w_1+w_2,w_3,,w_n} sortata crescator.

4 ------------------------------------------------------------------------------------------------------------------Structuri de date si tehnici de programare

1. Arbori binari 5 -----------------------------------------------------------------------------------------------------------------------

Testul de autoevaluare nr. 1 De ce expresiile aritmetice trebuie reprezentate prin arbori binari? Cate noduri interne are un arbore binar strict cu n frunze (n2) ? Cum se poate defini prin recurenta un arbore m-ar,in care fiecare nod care nu este frunza sa aiba cel mult m fii (m 2) si ordinea in care apar acestia sa aiba importanta ? Cum se poate defini parcurgerea unui arbore m-ar in ordinea RSD ? Ce structuri de date se pot folosi la aplicarea algoritmului lui Huffman astfel incat complexitatea sa timp sa fie liniara?. Justificati raspunsul.

Rspunsurile la test se vor da n spaiul liber din chenar, n continuarea e enunurilor

Rspunsurile la acest test se gsesc la pagina 333 a acestei uniti de nvare.

5 ------------------------------------------------------------------------------------------------------------------Structuri de date si tehnici de programare

6 Arbori binari ----------------------------------------------------------------------------------------------------------------------Tema de autoinstruire nr. 1 Consultai bibliografia pentru a afla : 1. Cum procedeaza algoritmul lui Huffman in cazul nebinar. Care este numarul de operatii efectuate de fiecare pas al algoritmului prezentat de parcurgere a unui arbore binar in ordinea simetrica,numar care depinde numai de numarul de noduri ale arborelui si nu de forma lui.

1.4. Comentarii i rspunsuri la testele de autoevaluare


Testul 1. 1. Operatorii care apar in expresiile aritmetice sunt operatori binari,care in general nu sunt comutativi (de exemplu scaderea,impartirea,exponentierea).De aceea,expresiile aritmetice trebuie reprezentate prin arbori binari,la care se face distinctie intre subarborele stang si cel drept. 2. Un arbore binar strict cu n frunze (n 2) are n-1 noduri interne.Aceasta proprietate se demonstreaza prin inductie dupa n:pentru n=2 ea se verifica.Presupunand-o adevarata pentru arborii binari cu n-1 frunze,fie T un arbore binar cu n frunze.Suprimand doua frunze ale acestuia,fiii aceluiasi nod intern,se obtine un arbore T cu n-1 frunze,deci cu n-2 noduri interne,conform ipotezei de inductie.Dar numarul de noduri interne ale lui T este egal cu numarul de noduri interne ale lui T plus 1,adica n-1. 3. Un arbore m-ar este fie vid,fie este alcatuit dintr-o radacina si o lista ordonata cu m elemente (A_1,A_2,,A_m) care sunt arbori m-ari.Arborele A_i se numeste subarborele de ordinul i al radacinii.Acesti subarbori au multimile de noduri disjuncte doua cate doua. 4. Se parcurge radacina,apoi subarborii radacinii A_1,A_2, ,A_m in aceeasi ordine RSD. 5. Se utilizeaza o coada pentru a memora nodurile interne ale arborelui create de algoritm cu ponderile corespunzatoare si o stiva sau o coada pentru a memora cele n frunze care au asociate cele n ponderi date initial,sortate crescator. Din lista liniara a frunzelor numai se scot noduri,la coada nodurilor interne,generate in ordine crescatoare a ponderilor,se scot si se adauga noduri. 6 ------------------------------------------------------------------------------------------------------------------Structuri de date si tehnici de programare S

1. Arbori binari 7 ----------------------------------------------------------------------------------------------------------------------Pentru a afla care sunt cele 2 noduri cu cele mai mici ponderi trebuie sa comparam ponderile a 4 noduri,2 situate in varful stivei (fata cozii) frunzelor si 2 situate in fata cozii nodurilor interne,ceea ce se realizeaza cu o complexitate O(1). Se elimina nodurile astfel gasite si se adauga un nou nod cu ponderea egala cu suma celor doua ponderi la spatele cozii nodurilor interne.Deoarece numarul nodurilor interne create de algoritm este egal cu n-1,complexitatea lui folosind aceasta structura de date este egala cu O(n).

1.5. Lucrare de verificare pentru studeni


Scriei un program pentru parcurgerea in ordinea simetrica a unui arbore binar si apoi insailarea lui relativ la aceeasi ordine.Gasiti in acest arbore binar insailat succesorul unui nod dat prin adresa lui. Indicaii de redactare: - introducei n program un numr suficient de comentarii pentru buna nelegere a programelor; - nsoii programul de o documentaie privind problema tratat, modul de introducere a datelor i aspecte deosebite folosite la elaborarea programelor. Rezolvrile, dar i dificultile ntmpinate, vor fi expediate prin mail tutorelui.

1.6. Bibliografie
[1] D. E. Knuth, Tratat de programarea calculatoarelor, Vol. I,Editura Tehnica, Bucuresti, 1973; retiparit, Editura Teora, 2000. [2] K.Mehlhorn, Data Structures and Algorithms, Springer-Verlag, Berlin,1984. [3] S. Sahni, Data Structures, Algorithms, and Applications in C++, Mc Graw Hill,1998. [4] S. Sahni, Data Structures, Algorithms, and Applications in Java, Mc Graw Hill, 2000. [5] I. Tomescu, Data Structures, Editura Universitatii din Bucuresti, 2008. 7 ------------------------------------------------------------------------------------------------------------------Structuri de date si tehnici de programare

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