P. 1
arbori_binari

arbori_binari

|Views: 54|Likes:
Published by Rusen George

More info:

Published by: Rusen George on Feb 22, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

05/01/2013

pdf

text

original

Arbori binari

I Definiţie:Se numeşte arbore un graf conex şi fără cicluri. Exemplu de arbore: Graful G=(V,M) unde V={1,2,3,4} şi M={[1,2],[2,3],[1,4]}, a cărui reprezentare grafică este figurată mai jos, este arbore.

Definiţie:Se numeşte arborescenţă un arbore caracterizat astfel: -are un vârf special numit rădăcină; -celelalte noduri pot fi grupate în p>=0 mulţimi disjuncte, astfel încât fiecare dintre aceste mulţimi să conţină un nod adiacent cu rădăcina iar subgrafurile generate de acestea să fie la rândul lor arborescenţe. OBSERVAŢII! 1. Dacă o arborescenţă este formată dintr-un singur nod spunem că este formată doar din nodul rădăcină.

1

următoarele noţiuni: • Succesor stâng: pentru un nod.2. succesorul stîng este nodul 7. se numeşte succesor stâng acel succesor care este figurat în stânga sa. • Succesor drept: pentru un nod. Ex:pentru nodul 1. arborescenţa se numeşte se numeşte arbore ordonat. 2 . fie un arbore ordonat în care fiecare nod are cel mult doi descendenţi(succesori). nodul 7. are importanţă. succesorul stîng este nodul 2. se numeşte succesor drept acel succesor care este figurat în dreapta sa. Definiţie:Se numeşte arbore binar.succesorul stîng nu există. o mulţime finită de noduri care este fie vidă. Dacă ordinea relativă a arborescenţelor. nodul 5. Exemplu de arbore binar: Teoriile care tratează arborii binari folosesc în plus faţă de cele care se referă la structurile arborescente în general.

Ex:pentru nodul 1 subarborele stâng este: • Subarbore drept: pentru un nod. se numeşte subarbore stâng subarborele care se obţine suprimând muchia care-l leagă pe acesta de succesorul său stâng. se numeşte subarbore drept subarborele care se obţine suprimând muchia care leagă pe acesta de succesorul drept. succesorul drept nu există.Ex:pentru nodul 1. dacă succesorul stâng nu există. • Subarbore stâng: pentru un nod. se spune că subarborele drept este vid. nodul 5. dacă succesorul drept nu există. se spune că subarborele stâng este vid. Ex:pentru nodul 1 subarborele drept este: 3 . succesorul drept este nodul 3.

toate situate pe acelaşi nivel.7.9. Ex:în arborele prezentat mai sus. are exact doi descendenţi. care nu este frunză. frunzele sunt nodurile 4. are în total 2p-1 noduri. Propoziţie:Un arbore binar complet care are p noduri terminale. Definiţie:Se numeşte arbore binar complet un arbore binar în fiecare nod. 4 .• Nod frunză(sau terminal): un nod se numeşte frunză dacă nu are descendenţi.8.

cu ajutorul vectorilor 2. putem spune că printre metodele de reprezentare a arborilor binari se numără şi metodele de reprezentare a grafurilor. 5 . Modalităţile de reprezentare specifice arborilor binari sunt: -reprezentarea standard: 1. -reprezentarea prin listele de adiacenţă. care înainte de toate este un graf. cum ar fi: -reprezentarea prin matricea de adiacenţă.folosind alocarea dinamică -reprezentarea cu ajutorul legăturilor Tata.REPREZENTAREA ARBORILOR BINARI Dacă avem în vedere faptul că un arbore binar este un arbore. -reprezentarea prin şirul muchiilor.

se face: 1... şi reţine 0. dacă acesta există...... rad.. descendentul drept şi informaţia.......Folosind vectorii OBSERVAŢIE! În acest caz. În cazul acestui mod de reprezentare. şi variabila rad cu următoarele semnificaţii: st[I]: reţine descendentul stâng al nodului I. se folosesc vectorii st... dacă acesta există.n. care prelucrează un arbore binar cu nodurile 1. dacă nodul I nu are decendent stâng...... şi reţine 0. readln(n). dacă nodul I nu are descendent drept. dr.. în cadrul unui program. dr şi info care au atâtea componente câte noduri are arborele. var st.. n.. I: byte. Implementarea acestui mod de reprezentare.... -pentru fiecare nod se precizează descendentul stâng..Reprezentarea standard Acest mod de reprezentare se realizează astfel: -se precizează nodul rădăcină... dr[I]: reţine descendentul drept al nodului I. 6 ... info[I]: reţine informaţia asociată nodului I rad: reţine nodul care reprezintă rădăcina arborelui... o Secţiunea de citire a datelor de intrare write(‘dati numarul de noduri ale arborelui n=’)..........30] of byte. secţiunile programului.... . info: şir.. sunt: o Sectiunea declaraţiilor Type şir=array[1..

st. readln(info[i]). readln(dr[i]).. write(‘descendentul stang:’).... In cazul acestui mod de reprezentare.. readln(st[i])...care prelucrează un arbore binar..... write(‘informatia:’).. readln(rad).....Folosind alocarea dinamică OBSERVAŢIE! În acest caz.I... end. dr: nod. dr: nod. write(‘descendentul drept:’)..... 7 .. . inr=record info: integer... fiecare nod este reprezentat de Heap de o înregistrare cu următoarea structură: Type nod=^inr. end.write(‘dati nodul radacina rad=’). var rad: nod... sunt: • Secţiunea declaraţiilor type nod=^inr.. inr=record info: integer... for i:=1 to n do begin writeln(‘pentru nodul ‘.\ end.... st...’dati:’). 2.secţiunile programului..

.. Reprezenarea cu ajutorul legăturii tata Acest mod de reprezentare se realizează astfel: -pentru fiecare nod. creare(rad^.... if(val<>0) then begin new(rad). write(‘val=’).. se precizează ce fel descendent este......... stâng sau drept. -pentru fiecare nod. rad^... .... end else rad:=nil............. end... creare(rad)...........st).....info:=val.. deoarece programul va reţine doar adresa rădăcinii...• Secţiunea de citire a datelor de intrare Această secţiune conţine decât apelul procedurii creare...... 8 ...... se precizează părintele său.... prezentată mai jos....dr). var val: integer. pentru părintele său. procedure creare(var rad:nod)......... readln(val). creare(rad^..

OBSERVAŢIE! Implementarea acestui mod de reprezentare. reţine valoarea 0. dacă nodul I este rădăcina arborelui. în cadrul unui program. PARCURGERA ARBORILOR BINARI Prin parcurgerea arborilor binari se înţelege examinarea în mod sistematic a nodurilor sale astfel încât să fie atins o singură dată. dacă acest există. de parcurgere: -parcurgerea în preordine (RSD: rădăcina-stânga-dreapta) -parcurgerea în inordine (SRD: stânga-rădăcina-dreapta) -parcurgerea în postordine (SDR: stânga-dreapta-rădăcina) Parcurgerea în preordine. se parcurge în preordine subarborele drept(are rădăcia dr[I]). dacă nodul I este descendent drept. se face folosind vectorii tata şi desc(desc=descendent). -dacă există. a arborelui cu rădăcina I. Există trei modalităţi. specifice arborilor binari. -dacă există. se parcurge în preordine subarborele stâng: stâng(are rădăcina st[I]). care au atâtea componente câte noduri are arborele. dacă nodul I nu are părinte(în cazul rădăcinii). 9 . desc[I]: reţine valoarea -1. şi reţine 0. dacă nodul I este descendent stâng. presupune parcurgerea etapelor: -se vizitează rădăcina(nodul i). reţine valoarea 1. cu următoarele semnificaţii: tata[I]: reţine părintele nodului I.

Parcurgerea.Parcurgerea în inordine. presupune parcurgerea etapelor: -dacă există. a arborelui cu rădăcina I. -se vizitează rădăcina(nodul I). se parcurge în inordine subarborele stâng(are rădăcina st[I]). se parcurge în postordine subarborele drept(are rădăcina dr[I]). a arborelui cu rădăcina I. -se viziteaiă rădăcina(nodul i). în postordine. -dacă există. -dacă există. se parcurge în postordine subarborele stâng(are rădăcina st[I]). se parcurge în inordine subarborele drept(are rădăcina dr[I]). presupune parcurgerea etapelor: -dacă există. Exemplu:Fie arborele binar: Lista nodurilor în urma parcurgerii: 10 .

dr. begin if (st[i]<>0) then inordine(st[i]). if (st[i]<>0) then preordine(st[i]). type sir=array[1. begin write(info[i]:4). if (dr[i]<>0) then inordine(dr[i]).n şi rădăcina I. end. end.6. i: byte. info: sir.5. în inordine. write(info[i]:4).5.l. procedure postordine(i:integer).4.2.. în postordine. n.3.5. begin if(st[i]<>0) then postordine(st[i]).30] of byte.7.6. rad.9 în postordine este: 4.6. if (dr[i])<>0) then preordine(dr[i]). program parcurgeri.9. procedure inordine(i:integer). uses crt. procedure preordine(i:integer). fiind dat un arbore binar cu nodurile 1.1 Exemplu de programare.în preordine este: 1.3..8. if (dr[i]<>0) then postordine(dr[i]).2.8. 11 . var st. afişează listele nodurilor obţinute în urma parcurgerilor în preordine.8.9 în inordine este: 4.7.7.2.3.

writeln. end. realn.write(info[i]:4). Implementare statică procedure preordine(i:integer). write(‘descendentul drept:’).’dati:’). writeln(‘preordine:’). begin clrscr. write(‘informatia:’). readln(dr[i]). writeln. inordine(rad). writeln(‘inordine:’). inordine. end. readln(st[i]). postordine(rad). write(‘dati nodul radacina rad=’). write(‘dati numarul de noduri ale arborelui n=’). writeln(‘postordine:’). preordine(rad). 12 . write(‘descendentul stang:’). writeln. end. for i:=1 to n do begin writeln(‘pentru nodul’. ATENŢIE! Procedurile de parcurgere ale arborilor binari (preordine. readln(rad). readln(n). begin if (i<>0) then begin write(info[i]:4). postordine) mai pot fi implementate şi ca mai jos. readln(info[i]).I.

end. write(info[i]:4). preordine(dr[i]). begin if (i<>0) then begin inordine(st[i]). procedure postordine(i:integer). procedure inordine(i:integer).. 13 . end. begin if (i<>0) then begin postordine(st[i]). end. end. postordine(dr[i]).preordine(st[i]). write(info[i]:4). end. end. inordine(dr[i]).

informaţiile nodurilor de pe nivelul p. 16.nodurile de pe nivelurile p. 10.. informaţiile nodurilor care au decât descendentul stâng. 14. nodurile care reţin ca informaţii numere pare . informaţiile conţinute de nodurile cu numere de ordine pare. 18. 2. 4. 9. nodurile care au ca tată pe nodul nod. 3. ţi rădăcina 1. nodurile cu doi descendenţi. tatăl nodului nod. 13. 17. care afişează: 1. 6. în care fiecare nod are ca informaţie o valoare întreagă. 11. 5. nivelul pe care se află nodul nod. descendentul drept al nodului nod. informaţiile nodurilor terminale. 15. 7.APLICAŢII ALE ARBORILOR BINARI Fiind dat un arbore binar cu nodurile notate 1.n. nodurile care au decât descendentul stâng. 14 . 8. 12. descendentul stâng al nodului nod. . nodurile care au decât descendentul drept. descendenţii nodului nod. să se realizeze subprograme . nodurile a căror informaţie este egală cu valoarea val. informaţiile nodurilor care au decât descendentul drept. nodurile terminale.în Pascal.

nod:byte. nodurile a căror informaţie este egală cu valoarea val. write('info['.. readln(dr[i]).30] of byte. readln(info[i]).st. 20. write('st['. readln(n). nodurile a căror informaţie este egală cu valoarea val ţi sunt terminale. procedure citire. uses crt. for i:=1 to n do begin writeln('informatiile despre nodul'.19.i.i.i. Rezolvare program atestat. type sir=array[1. writeln('dati radacina:').']=').şi se găsesc pe nivelul p. begin clrscr.dr:sir. readln(rad). end.i).']='). write('n='). begin if (info[i] mod 2=0) then write(i:4). write('dr['. procedure afis_2(i:integer).n. end.f:text. 15 . var rad. readln(st[i]).']=').i. info.

if(dr[i]<>0) then afis_3(dr[i]). end. begin if((st[i]<>0) and (dr[i]<>0)) then write(i:4). 16 . if(st[i]<>0) then afis_3(st[i]). procedure afis_3(i:integer).info[i]).info[i]).i:4. procedure afis_4(i:integer).i:4.' cu informatia '. end. if (dr[i]<>0) then afis_4(dr[i]). if(st[i]<>0) then afis_5(st[i]). end. begin if((dr[i]<>0) and (st[i]=0)) then writeln('nodul '. if (dr[i]<>0) then afis_5(dr[i]). end. procedure afis_5(i:integer). if (st[i]<>0) then afis_4(st[i]).' cu informatia '. if (dr[i]<>0) then afis_2(dr[i]).if(st[i]<>0) then afis_2(st[i]). begin if((dr[i]=0) and (st[i]<>0)) then writeln('nodul '.

if (dr[i]<>0) then afis_6(dr[i]). begin if (i=nod) then begin if (st[i]<>0) then write(st[i]:4) else write(' stangul nu exista'). begin if ((dr[i]=0) and (st[i]=0)) then writeln ('nodul '. procedure afis_7(i:integer. end else begin if(st[i]<>0) then afis_7(st[i].' cu informatia '.nivel:integer). procedure afis_8(i:integer. if(dr[i]<>0) then afis_7(dr[i]. begin if (i=nod) then write(nivel) 17 . end.nod).i:4. if (dr[i]<>0) then write (dr[i]:4) else write(' dreptul nu exista').info[i]). end.nod:integer). end. if (st[i]<>0) then afis_6(st[i]).nod).nod:integer.procedure afis_6(i:integer).

readln(nod).nivel+1). afis_3(rad). end. write('nod= '). writeln. writeln. Writeln('nodurile cu inf pare '). afis_2(rad). writeln. citire. writeln. writeln('afisare noduri cu descendent drept si informatie continuta in nod'). writeln('afisare noduri terminale. begin clrscr. afis_4(rad). end.nod. writeln('nodurile cu 2 descendenti '). afis_5(rad). 18 .else begin if(st[i]<>0) then afis_8(st[i]. writeln('afisare noduri cu descendent stang si informatie continuta in nod').nod.nivel+1). afisare informatie continuta in nod'). afis_6(rad). if (dr[i]<>0) then afis_8(dr[i]. writeln.

end. nod.writeln('descendentii nodului '. nod.nod). writeln('nivelul pe care se gaseste nodul '. ' este '). readln. writeln.nod. ' sunt '). afis_7(rad. 19 . afis_8(rad.1).

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->