Sunteți pe pagina 1din 3

Structuri arborescente (grafuri de tip arbore) Structuri arborescente Structuri arborescente Structuri arborescente Structuri arborescente Structuri arborescente

ente Structuri arborescente Reprezentari si parcurgeri (arbori orientati) Reprezentarea Fiu-Frate N: numarul de noduri R: eticheta nodul radacina FIU(i): eticheta primului descendent al vrfului i FRATE(i): eticheta vrfului descendent al tatalui vrfului i si care urmeaza imediat lui i INF(i): informatia atasata vrfului i adesea informatia e chiar valoarea i, caz n care vectorul INF nu mai e necesar Valoare lipsa (fiu, frate): se foloseste o valoare conventionala (0, -1 ) Reprezentarea Fiu-Frate Reprezentare folosind structuri dinamice Presupunnd ca fiecare vrf al arborelui are cel mult n descendenti, fiecarui vrf i es te asociata structura Parcurgeri Aplicarea sistematica a unei reguli de vizitare a vrfurilor arborelui. Cele mai utilizate reguli de parcurgere a arborilor orientati snt A-preordine (varianta DF) A-postordine (varianta DF) parcurgerea pe niveluri (BF) Parcurgerea n A-preordine (Fiu-Frate) Se viziteaza vrful curent si se identifica descendentii lui. Se aplica aceeasi re gula de vizitare pentru fiecare dintre arborii avnd ca radacini descendentii vrful ui curent. void A_preordine (nod R) { if (R) { vizit (R); A_preordine(FIU[R]); A_preordine(FRATE[R]); } } 1, 2, 5, 6, 9, 10, 11, 12, 13, 7, 3, 4, 8, 14, 15, 16 Parcurgerea n A-postordine (Fiu-Frate) Se identifica si se viziteaza descendentii vrfului curent, apoi se viziteaza vrful curent. Se aplica aceeasi regula de vizitare pentru arborii avnd ca radacini des cendentii vrfului curent. void A_postordine (nod R) { if (R) { A_postordine(FIU[R]); vizit (R); A_postordine(FRATE[R]); } }

5, 9, 10, 11, 12, 13, 6, 7, 2, 3, 14, 15, 16, 8, 4, 1 Parcurgeri n adncime (str. dinamice) void A_preordine (nod R) { if (R) { vizit (R); for(i=0;i<n;i++) A_preordine(R->leg[i]); } } void A_postordine (nod R) { if (R) { for(i=0;i<n;i++) A_postordine(R->leg[i]); vizit (R); } } Parcurgerea pe niveluri (Fiu-Frate) void parcurgere_pe_niveluri(nod R, int FIU[], int FRATE[], int n) { TNOD* C = NULL; push(C,R); while (C) { pop(C,v); VIZIT(v); v=FIU[v]; while(v) { push(C,v); v=FRATE[v]; } } } 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 Parcurgerea pe niveluri (str. dinamice) void parcurgere_pe_niveluri(nod *R) { TNOD* C = NULL; push(C,R); while (C) { pop(C,v); VIZIT(v); for(i=0;i<n;i++) if(R->leg[i]) push(C,R->leg[i]); } } 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 Arbori partiali Arbori partiali Algoritmul lui Kruskal Algoritmul lui Kruskal Algoritmul lui Kruskal Functie pentru determinarea radacinii int radacina(int v,int tata[]) { int u = v; while(tata[u] >= 0) u = tata[u];

return u; } Ex.: v = 4 u = 4 tata[4]=2 u = 2 tata[2]=1 u = 1 tata[1]=-6 < 0 Algoritmul lui Kruskal int kruskal(int a[][3],int nm, int nv, int b[][3]) { int tata[50],i,j, v1, v2, r1, r2; int c=0; for(i=0; i<nv; i++) tata[i]=-1; for(i=j=0; j<nv-1; i++) { v1=a[i][0]; v2=a[i][1]; r1=radacina(v1,tata); r2=radacina(v2,tata); if( r1 != r2 ) { if( tata[r1] < tata[r2] ) { tata[r1]+=tata[r2]; tata[r2]=r1; } else { tata[r2]+=tata[r1]; tata[r1]=r2; } b[j][0]=a[i][0]; b[j][1]=a[i][1]; b[j][2]=a[i][2]; c+=a[i][2]; j++; } } return c; }

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