You are on page 1of 5

Arbori generalizati - Laborator Proiectarea si Analiza Algoritmilor

Laborator Proiectarea si Analiza Algoritmilor


Home Calendar Regulament

Arbori generalizati
Definitii
Un arbore este o colectie de noduri si arce care satisfac anumite cerinte. Fiecarui nod i se pot asocia date. Un nod este radacina arborelui, restul nodurilor formand un numar finit de arbori (subarbori), doi cate doi disjuncti. Un arc conecteaza doua noduri distincte ale arborelui. O cale (drum) intr-un arbore este o lista de noduri distincte in care nodurile succesive sunt conectate prin arce. Intr-un arbore exista o cale si numai una intre oricare doua noduri ale arborelui. Intr-un arbore se definesc mai multe niveluri, radacina fiind situata pe nivelul 1. Un nod x este pe un nivel superior unui nod y daca x se gaseste pe calea de la nodul y la radacina. Tipuri de relatii intre noduri:

Home >

parinte: nodul x situat pe nivelul imediat urmator unui nod y si conectat de y printr-un arc se numeste parintele lui y, fiu : succesorii directi ai unui nod se numesc fii sai, frate: succesorii directi ai unui nod sunt frati intre ei.
Nivelul maxim al arborelui se numeste inaltimea arborelui. Lungimea celui mai lung drum de la un nod x la un nod terminal (nod frunza) se numeste inaltimea nodului x. Lungimea drumului de la radacina la un nod x se numeste adancimea nodului x. Numarul fiilor unui nod se numeste gradul nodului. Gradul maxim al nodurilor arborelui se numeste gradul arborelui.

Translate

Traversarea arborilor
Traversarea unui arbore este procesul de aplicare a unei operatii (examinare, actualizare) asupra fiecarui nod al unui arbore. In timpul traversarii nodurile arborelui sunt prelucrate intr-o anumita ordine. In functie de ordinea prelucrarii se disting trei moduri de a traversa un arbore: preordine , inordine si postordine. Cele trei moduri se definesc recursiv astfel:

http://sites.google.com/site/laboratorpaa/home/lab1[6/24/2011 3:02:24 PM]

Arbori generalizati - Laborator Proiectarea si Analiza Algoritmilor

daca arborele A este vid atunci ordonarea in preordine, inordine sau postordine este vida, daca arborele A este format dintr-un singur nod, atunci ordonarea este formata din acel nod, alfel, se considera arborele A ca fiind format din radacina R si subarborii A1, A2,..., An; traversarea lui A in: 1. preordine : inseamna prelucrarea lui R, apoi traversarea in preordine a subarborilor A1, A2,..., An. 2. inordine: inseamna traversarea in inordine a lui A1, apoi prelucrarea lui R, apoi traversarea in inordine a subarborilor A2,..., An. 3. postordine: inseamna traversarea in postordine a subarborilor A1, A2,..., An, apoi prelucrarea lui R. Exemplu: Se considera arborele generalizat din figura de mai jos:

Traversarea in preordine genereaza secventa de noduri: a, b, e, i, f, c, g, j, d, h Traversarea in inordine genereaza secventa de noduri: i, e, b, f, a, j, g, c, h, d Traversarea in postordine genereaza secventa de noduri: i, e, f, b, j, g, c, h, d, a

Tehnici de implementare
1. Implementarea cu ajutorul tipului tablou
Pentru aceasta reprezentare se considera ca nodurile arborelui A sunt numerotate de la 0 la n-1. Nodurile sunt stocate intr-un tablou de dimensiune n astfel incat nodul cu numarul i sa se gaseasca pe pozitia i a tabloului. Fiecare element al tabloului va avea doua campuri: un camp va contine informatia utila din nod, iar un al doilea camp va contine indicele nodului parinte in tablou (-1 pentru nodul radacina). struct nod_arbore { tip_info info_utila; int index_parinte; }; struct nod_arbore arb[n]; Conventional, numerotarea nodurilor se face de sus in jos si de la stanga la dreapta. Exemplu:

Dezavantaje: Presupune stabilirea a-priori a dimensiunii arborelui si a numarului de fii ai fiecarui nod. Operatii precum determinarea fiilor unui nod sau calcularea inaltimii arborelui sunt costisitoare. Reprezentarea nu capteaza ordinea fiilor unui nod decat daca se respecta conventia de numerotare recomandata.

http://sites.google.com/site/laboratorpaa/home/lab1[6/24/2011 3:02:24 PM]

Arbori generalizati - Laborator Proiectarea si Analiza Algoritmilor

2. Implementarea cu ajutorul tipului lista

In aceasta implementare, pentru fiecare nod al arborelui se va crea o lista a fiilor sai. Indicatorii de inceput ai listelor de fii vor fi pastrati tot intr-o structura de tip tablou. Fiecare element al tabloului va avea doua campuri: un camp va contine informatia utila din nod, iar un al doilea camp va contine indicatorul de inceput al listei de fii a nodului. struct fiu { int index; struct fiu *urm; }; struct nod_arbore { tip_info info_utila; struct fiu *lista_fii; }; struct arbore { struct nod_arbore noduri[n]; int index_radacina; }; struct arbore arb; Exemplu:

Dezavantaje: In cazul cel mai nefavorabil, determinarea parintelui unui nod x presupune cautarea nodului x in toate listele de fii.

3. Implementarea bazata pe relatiile prim-fiu si frate-drept

Este o implementare mai avantajoasa, spatiul folosit pentru stocarea unui arbore cu n noduri fiind O(n). Nodurile arborelui sunt stocate intr-un tablou. Fiecare element al tabloului va avea patru campuri: 1. un camp va 2. un camp va 3. un camp va dreapta), 4. un camp va contine informatia utila din nod, contine indexul in tablou al celui mai din stanga fiu (-1 pentru nodurile terminale), contine indexul in tablou al fratelui din dreapta al nodului (-1 daca nu exista un frate in contine indexul parintelui (-1 pentru nodul radacina).

struct nod_arbore { tip_info info_utila; int prim_fiu; int frate_drept; int parinte; }; struct arbore { struct nod_arbore noduri[n]; int index_radacina; }; struct arbore arb; Exemplu:

http://sites.google.com/site/laboratorpaa/home/lab1[6/24/2011 3:02:24 PM]

Arbori generalizati - Laborator Proiectarea si Analiza Algoritmilor

4. Implementarea ca multilista

Este tot implementare bazata pe relatiile prim-fiu si frate-drept doar ca pentru stocarea nodurilor se vor folosi liste simplu inlantuite si pointeri. struct nod_arbore { tip_info info_utila; struct nod_arbore *prim_fiu; struct nod_arbore *frate_drept; struct nod_arbore *parinte; }; struct arbore *radacina; Exemplu:

Aplicatii
I. Sa se implementeze un arbore binar generalizat folosind tehnica bazata pe relatiile prim-fiu si frate drept. Informatia utila (cheia) asociata fiecarui nod este un numar intreg. Se vor implementa operatiile: 2. insereaza_cheie(int cheie, int cheie_parinte) - insereaza in arbore un nod cu cheia specificata ca si fiu al nodului avand cheia cheie_parinte 3. int cauta_cheie(int cheie) - cauta cheia specificata in arbore; daca exista un nod avand cheia data se returneaza indicele nodului, alfel se returneaza -1 4. sterge_cheie(int cheie) - sterge cheia specificata din arbore 1. initializeaza - distruge arborele daca exista si creeaza un nou arbore

5. preordine() - traverseaza arborele in preordine si afiseaza cheile nodurilor 7. postordine() - traverseaza arborele in postordine si afiseaza cheile nodurilor 6. inordine() - traverseaza arborele in inordine si afiseaza cheile nodurilor

8. int inaltime_arbore() - returneaza inaltimea arborelui 9. int grad_arbore() - returneaza gradul arborelui

II. Sa se implementeze un arbore binar generalizat folosind multiliste. Informatia utila (cheia) asociata fiecarui nod este un numar intreg. Se vor implementa operatiile: 2. insereaza_cheie(int cheie, int cheie_parinte) - insereaza in arbore un nod cu cheia specificata ca si fiu al nodului avand cheia cheie_parinte 3. cauta_cheie(int cheie) - cauta cheia specificata in arbore; daca exista un nod avand cheia data se 1. initializeaza - distruge arborele daca exista si creeaza un nou arbore

returneaza nodul, alfel se returneaza NULL 4. sterge_cheie(int cheie) - sterge cheia specificata din arbore

http://sites.google.com/site/laboratorpaa/home/lab1[6/24/2011 3:02:24 PM]

Arbori generalizati - Laborator Proiectarea si Analiza Algoritmilor

5. preordine() - traverseaza arborele in preordine si afiseaza cheile nodurilor 7. postordine() - traverseaza arborele in postordine si afiseaza cheile nodurilor 6. inordine() - traverseaza arborele in inordine si afiseaza cheile nodurilor

8. int inaltime_arbore() - returneaza inaltimea arborelui 9. int grad_arbore() - returneaza gradul arborelui

Copyright 2011 Georgiana Macariu Sign in Recent Site Activity Terms Report Abuse Print page | Powered by Google Sites

http://sites.google.com/site/laboratorpaa/home/lab1[6/24/2011 3:02:24 PM]