1.

Noţiuni introductive
Există mai multe moduri echivalente de definire a arborilor. Din punctul de vedere al teoriei grafurilor numim arbore un graf neorientat conex şi fără cicluri. Dacă graful este aciclic, dar nu este conex îl vom numi pădure. De exemplu,

Fig. 1. a. este arbore, b. este pădure, nefiind conex, iar c. nu este nici arbore, nici pădure, deoarece conţine cicluri. 1.1. Proprietăţi ale arborilor Teorema 1 Fie G = (V, U) un graf neorientat. Următoarele afirmaţii sunt echivalente: 1) G este arbore. 2) Oricare două vârfuri din G sunt unite printr-un lanţ simplu unic. 3) G este conex minimal (dacă suprimăm o muchie, graful obţinut este neconex). 4) G este conex şi are  -1 muchii. V 5) G este aciclic şi are  -1 muchii. V 6) G este aciclic maximal (dacă adăugăm o muchie, graful obţinut conţine cicluri). Demonstraţie: 1 ⇒2 Dacă G este arbore, atunci G este conex, deci oricare ar fi două vârfuri din graf, acestea sunt unite prin cel puţin un lanţ simplu. Presupunem prin reducere la absurd că există x şi y două vârfuri unite prin două lanţuri simple distincte l1 şi l2 .

5

Fig. 2. Fie z primul vârf de la care cele două lanţuri se despart, iar t primul vârf în care cele două lanţuri se întâlnesc din nou. Dacă notăm l'1 porţiunea de pe lanţul l1 între z şi t, iar cu l'2 porţiunea de pe lanţul l2 între z şi t, atunci l'1 şi l'2 nu au vârfuri comune, cu excepţia vârfurilor z şi t. Concatenând l'1 şi l'2, obţinem un ciclu- contradicţie cu ipoteza că G este arbore. Deci, oricare două vârfuri din graf sunt unite printr-un lanţ simplu unic. 2 ⇒3 Dacă oricare două vârfuri x, y∈V sunt unite printr-un lanţ simplu unic, atunci orice muchie [x, y]∈U reprezintă unicul lanţ dintre x şi y. Suprimând muchia [x, y], între x şi y nu va mai exista lanţ, deci graful obţinut nu va mai fi conex. 3 ⇒4 Notăm cu n numărul de vârfuri şi cu m numărul de muchii din graf. Pentru a demonstra că orice graf conex minimal are n-1 muchii vom demonstra prin inducţie completă după n că m ≤ n-1. Cum în orice graf conex m ≥ n-1, deducem m = n-1. P(1) Dacă n = 1, atunci m = 0 ⇒ m = n-1. P(2) Dacă n = 2, atunci m = 1 ⇒ m = n-1. P(n) Presupunem că într-un graf conex minimal cu cel mult n vârfuri numărul de muchii este strict mai mic decât numărul de vârfuri. P(n+1) Demonstrăm că într-un graf conex minimal cu n+1 vârfuri, numărul de muchii este cel mult egal cu n. Fie G conex minimal cu n+1 vârfuri şi m muchii. Eliminând o muchie oarecare din graf obţinem un graf G' cu m-1 muchii şi două componente conexe C1 şi C2 cu n1, respectiv n2 vârfuri (n1+n2 = n+1) şi m1, respectiv m2 muchii (m1+m2 = m-1). Subgrafurile C1 şi C2 sunt conexe minimale, altfel graful G nu ar fi conex minimal. Din ipoteza inductivă rezultă că m1 ≤ n1-1, m2 ≤ n2-1; dar m1+m2 = m-1 ≤ n1+n2 = n-2 ⇒ m ≤ n-1. Deci G conex minimal implică G conex cu n-1 muchii. 4 ⇒5 Fie G un graf conex cu n-1 muchii. Să demonstrăm că G este
6

aciclic. Presupunem prin reducere la absurd, că graful G conţine un ciclu C format din vârfurile v1, v2, ..., vk. Să considerăm subgraful parţial Gk = (Vk, Uk) constând din ciclul C. Deci Vk = {v1, v2 ,..., vk}, iar Uk = {[v1,v2)], [v2,v3],...,[vk-1,vk], (vk,v1]} ( k=Uk= k). Dacă  k V atunci ∃ vi∈Vk şi vk+1∈V-Vk V V < , astfel încât [vi, vk+1]∈U, graful G fiind conex. Construim Gk+1 = (Vk+1, Uk+1) astfel :Vk+1 = Vk ∪{vk+1}; Uk+1= Uk∪{[vi,vk+1]} şi  k+1=Vk+1=k+1. U Cât timp k+1 < n, aplicăm acelaşi procedeu până când obţinem un graf Gn = (V, Un), cu  n= n, Un ⊆ U; deci  ≥ n, contradicţie U U cu ipoteza  U= n-1. 5 ⇒6 Presupunem că graful G este aciclic cu n-1 muchii, să demonstrăm că G este aciclic maximal. Fie C1, C2,..., Cp cele p componentele conexe ale grafului G, având respectiv n1, n2,..., np vârfuri şi m1, m2,..., mp muchii fiecare. Evident că n1+n2+...+np = n şi m1+m2+...+mp = n-1. Cum graful G este aciclic, deducem că fiecare componentă conexă este un arbore. Deoarece am demonstrat că 1 ⇒ 5, rezultă că m i= ni-1, ∀i∈{1, 2, ..., p}. Înlocuind în relaţia de mai sus, obţinem n-p = n-1 ⇒ p = 1, deci G conex. Dacă G este conex şi aciclic, conform definiţiei G este arbore. Dar am demonstrat că 1 ⇒ 2, deci oricare două vârfuri din G sunt unite printr-un lanţ simplu. Astfel, adăugând orice muchie obţinem un ciclu. 6 ⇒1 Presupunem că graful G este aciclic, dar dacă am mai adăuga o muchie s-ar obţine un ciclu. Să demonstrăm că G este conex. Fie u şi v două vârfuri neadiacente din graf, arbitrar alese. Deoarece adăugând muchia [u, v] se obţine un ciclu, rezultă că u şi v sunt unite printr-un lanţ ale cărui muchii aparţin grafului G. Cum u,v au fost alese arbitrar, deducem că graful G este conex. Q.E.D. Teorema 2 Numerele întregi 0 < d1 ≤ d2 ≤ ...≤ dn (n ≥ 2) sunt gradele vârfurilor unui arbore dacă şi numai dacă d1+d2+...+dn = 2n-2. Demonstraţie: Necesitatea Condiţia este necesară, deoarece orice arbore cu n vârfuri are n-1 muchii, iar suma gradelor vârfurilor oricărui graf este de două ori numărul de muchii. Deci d1+d2+...+dn = 2n-2.
7

Suficienţa Fie 0 < d1 ≤ d2 ≤ ...≤ dn astfel încât d1+d2+...+dn = 2n-2. Să demonstrăm că există un arbore cu gradele vârfurilor d1, d2,..., dn. Vom proceda prin inducţie. P(2) Dacă d1+d2 = 2, atunci d1 = d2 = 1 , arborele fiind cel din figura de mai jos :

Fig. 3 P(n) Presupunem acum că proprietatea este adevărată pentru orice secvenţă de n numere naturale 0 < d1 ≤ d2 ≤ ...≤ dn, astfel încât d1+d2+...+dn = 2n-2. P(n+1) Să demonstrăm că pentru orice secvenţă 0 < d'1 ≤ d'2 ≤ ...≤ d'n ≤ d'n+1 astfel încât d'1+d'2+...+d'n+1 = 2n, există un arbore cu n+1 vârfuri cu secvenţa gradelor d'1, d'2, ..., d'n+1. Observăm că există măcar un nod terminal x1 cu gradul d'1= 1, altfel dacă di ≥ 2,∀i∈{1, 2,..., n+1} ⇒ d'1+d'2+...+d'n+1 ≥ 2(n+1), ceea ce contrazice ipoteza. În mod analog, observăm că există măcar un nod neterminal xn+1, cu gradul d'n+1 > 1, altfel dacă d'i = 1,∀i∈{1, 2, ..., n+1} ⇒ d'1+d'2+...+d'n+1 = n+1 < 2n . Să considerăm următoarea secvenţă de n numere întregi d'2,..., d'n, d'n+1-1 cu proprietatea că d'2+...+d'n+d'n+1 = 2n-2. Din ipoteza inductivă există un arbore An cu n vârfuri şi secvenţa gradelor d'2,..., d'n, d'n+1-1. Adăugăm la arborele An un vârf pe care îl unim printr-o muchie cu vârful având gradul d'n+1-1. Obţinem un arbore An+1 cu gradele vârfurilor d'1, d'2,..., d'n+1. Q.E.D. Demonstraţia acestei teoreme oferă şi o soluţie constructivă pentru obţinerea unui arbore cu secvenţa gradelor dată. Vom reţine gradele vârfurilor într-un vector d de dimensiune n, ordonat crescător, cu suma componentelor egală cu 2n-2. Arborele va fi reprezentat prin matricea muchiilor, o matrice a cu două linii şi n-1 coloane, în care pentru fiecare muchie din arbore vom reţine extremităţile. Spre deosebire de ideea din demonstraţie, pentru a conserva ordinea în vectorul d, la fiecare pas al algoritmului gradul care va fi decrementat va fi primul grad mai mare ca 1 şi nu ultimul. Procedure Determinare Arbore;*
*

Programul Construcţie-Arbore-cu-Secvenţa-Gradelor-Dată de la sfârşitul capitolului curent generează un arbore având secvenţa gradelor dată. 8

//vectorul d, matricea a şi n, numărul de vârfuri, sunt variabile globale var NrMuchiiSelectate, VfTerminal, VfNeterminal: Integer; begin NrMuchiiSelectate := 0; VfTerminal := 1; while NrMuchiiSelectate < n-1 do begin //selectez o muchie în arbore VfNeterminal := VfTerminal + 1; //caut un vârf cu grad mai mare decât 1 while d[VfNeterminal] = 1 do inc(VfNeterminal); inc(NrMuchiiSelectate); //selectez muchia [VfTerminal,VfNeterminal] a[1,NrMuchiiSelectate] := VfTerminal; a[2,NrMuchiiSelectate] := VfNeterminal; dec(d[VfNeterminal]); inc(VfTerminal); end; end; De exemplu, pentru n = 11 şi şirul gradelor: 1 2 3 4 5 6 7 8 9 1 0 1 1 1 1 1 1 1 2 3 4 obţinem arborele din figura 4. 11 4

Fig. 4 Acest procedeu sugerează o metodă foarte eficientă de reprezentare a arborilor. Dacă An este un arbore cu vârfurile x1, x2,.., xn, suprimăm vârful terminal cu cel mai mic indice şi muchia incidentă cu acesta şi reţinem a1, vârful adiacent cu vârful terminal suprimat. Am obţinut astfel un subgraf cu n-2 muchii conex şi aciclic, deci un arbore An-1. Repetăm procedeul pentru arborele An-1, determinând un al doilea vârf, a2, adiacent cu vârful terminal de indice minim ce va fi eliminat din An-1 împreună cu muchia incidentă cu el ş.a.m.d., până când se obţine un arbore A2 cu două vârfuri adiacente.
9

n-2} ..... graful cu muchiile U = {[ai. ..... ∀i∈{1. bi].2. ∀i∈{1. . 1 ≤ ai ≤ n... cu j > i. b2.11}..n2}.. a2. a2. Construim A.. Completăm a cu an-1 = n şi definim bi conform relaţiei (*). . bi-1. există un arbore A cu n vârfuri astfel încât codul Prüffer al lui A să fie şirul a. muchiile arborelui A={[ai. bn-2. an-2}.. 2. ... b2.. ai.. b2. 2.. . ..... n-1}... Să notăm b = (b1. an-2}. an-1}} (*) Deci din codul Prüffer am putut determina în mod unic ordinea de eliminare a vârfurilor şi implicit. .n-2} asociat arborelui An numit codul Prüffer al lui An . a2. Completăm şirul cu an-1 = n.Am obţinut astfel un sistem {a1. ∀i ≠ j (deoarece un nod nu poate fi eliminat decât o dată).10....11.. 2. . ai∈{1. Propoziţie Există o corespondenţă biunivocă între mulţimea arborilor A cu n vârfuri şi mulţimea sistemelor {a1. bi ≠ aj...9.. . codul Prüffer este a={ 8. a2.an-2..10... altfel k ar fi adiacent cu un vârf ce va fi suprimat ulterior.. . bn-1) indicii vârfurilor în ordinea în care au fost eliminate. deci k = aj. deci a = {a1. an-2}. ai.... a2.. bi-1...9. bi]).2......2. Demonstraţie: Injectivitatea Fie a={ a1. . ∀i∈{1.. b2. bi.. ∀i∈{1. . ∀i∈{1.n}.10... 2.n-2}. ..... bi-1}. ∀j > i (bi fiind eliminat la pasul i.an1}.. ∀i∈{1...contradicţie (un vârf care nu a fost eliminat şi care nu este părinte pentru un alt vârf.. 10 ...... 5. k este un vârf terminal al arborelui A-{b1.a2. 4. nu mai poate fi părintele unui alt vârf eliminat ulterior).. codul Prüffer al unui arbore A. Pentru arborele din figura 4. 1 ≤ ai ≤ n. n-1}}. n-1}} Surjectivitatea Demonstrăm că ∀a = {a1.11. 3. ai+1..2. din modul de definire a codului Prüffer va fi : bi = min{ k  k∉{b1. an-1}. este vârf terminal). an-2}.2. bi ≠ bj. an-2} de n-2 numere 1≤ ai≤ n. ai+1. ∀ k ∈{b1. bi]. bi ≠ ai (pentru că există muchia [ai. Observăm că : 1. i ∈{1. Vom arăta că A este arbore şi codul Prüffer al lui A este {a1.

2.10.2...8.7..7.11]. .D.2.2.E.10.8. Tot din definirea lui bi rezultă că bi este vârful terminal de indice minim. a2.4.2.2.8..1.1.5}. bi = min{ k k∉{b1. [4.8.5.11}}=10 b8 = min { kk∉{3.[bi-1.6.1.5..10]. pentru că din relaţia (*) ai ≠ bj.4.8]. [5.5.. Fig.6]... cu j > i ceea ce este în contradicţie cu definiţia lui bi. a1].6.2.2.5.2.11}}=7 b4 = min { kk∉{3. de exemplu. incidentă cu aceasta.1. în particular A este arbore. Deci a={ 1.∀j < i. Q.6.11}}=9 b7 = min { kk∉{3.1.2.4..2. . .11}}=8 b5 = min { kk∉{3. b2..6. completăm codul cu a10= 11.1. bi-1}. ai-1]}.4.7. conform definiţiei. iar bi nu poate fi adiacent în Ai decât cu ai.11}}=6 b3 = min { kk∉{3..n} sunt arbori.. [2.. Procedând inductiv.5.4....2.11}}=2 b6 = min { kk∉{3.1. dacă bi ar fi incident cu o altă muchie [bj.4.1.8...7..4]..11}}=5 Muchiile arborelui sunt : [1.4.4.2.. cum An este arbore.1.6.1.2].1.. b2.4. [1.11}}=3 b2 = min { kk∉{3.1. Evident A = A1.11}}=4 b9 = min { kk∉{3. ai]. [2. .5.1.4.n-1}.2. j > i din Ai ar însemna că bi = bj sau aj = bi.1. Ai-1 se obţine din Ai eliminând vârful terminal bi şi muchia [bi. ai-2} va fi codul Prüffer al arborelui Ai. Vi = {1. an-1}} Dar ai∈Ai.9. bi-1.5.2.11} şi determinăm : b1 = min { kk∉{1. {a1.7]. Pentru a determina muchiile arborelui cu acest cod Prüffer. deci An este arbore.. i∈{1..1].5.4. [1. Să considerăm. aj]. ai+1.4. [5.4.9.2. În particular deducem că {a1 . .9].n}-{b1.2.a2.6.1..2. [4. deducem că Ai.9.3].4. ∀i∈{1...8. 5 11 . deci.Notăm Ui = U-{[b1. [2.10.4.5.7.5. n = 11 şi a = {1.2.2.11}}=1 b10 = min { kk∉{3.4.7.6.2..6.4..1. an-2} este codul Prüffer al arborelui A.. iar An este format numai din vârful n.7.4.9.. ai.1.2.1. Să demonstrăm că bi este vârf terminal în Ai.4. deoarece.

var k.Folosind acest rezultat.. Aplicaţie* Generaţi toţi arborii cu n vârfuri. an-1]. MB: set of byte.. procedure generare(i:byte)...n-2... begin if i = n-1 then // codul este complet determina_arbore else for j := 1 to n do begin a[i] := j. Vom genera toate codurile Prüffer posibile recursiv.2.. // completăm poziţiile i.. cu valori într-o mulţime cu n elemente.. //mulţimea vârfurilor pentru care trebuie să determinăm nodul // terminal adiacent begin MB := []. Această formulă poartă numele de formula lui Cayley.. a2.. end. for i := 1 to n . procedure determina_arbore. MA := [a1.1 do //determin cele n-1 muchii ale arborelui begin * Programul Generare-Arbori-cu-n-Varfuri de la sfârşitul capitolului curent generează toţi arborii cu n vârfuri date. Problema se reduce la generarea tuturor funcţiilor a:{1. end.. i: byte.. apelând procedura generare(1).i-1 din vectorul global a sunt fixate.n} şi determinarea arborelui corespunzător fiecărei funcţii. deducem că numărul arborilor ce se pot construi cu n vârfuri date este egal cu nn-2. generare(i + 1)... //poziţiile 1. // afişează muchiile arborelui. numărul funcţiilor bijective definite pe o mulţime cu n-2 elemente.2...n-2} → {1. .. //mulţimea vârfurilor care au fost deja eliminate din arbore MA: set of byte.2. 12 ..

A2. cea mai mare parte a termenilor folosiţi în limbajul informatic derivă de aici.. orice nod al unui arbore fiind rădăcina unui subarbore. An se numesc subarborii rădăcinii.există un nod special numit rădăcina arborelui.6.)... MB := MB + [k]. este utilă introducerea unei noi noţiuni..arbore cu rădăcină. Să observăm că alegând într-un mod arbitrar un vârf drept rădăcină. Arbori cu rădăcină Pentru problemele în care se impune o ierarhizare a informaţiilor ce corespund vârfurilor arborelui. An. vârful de indice minim ce ∉ MA∪ MB k := 1. orice graf neorientat conex şi fără cicluri este un arbore cu rădăcină în sensul definiţiei de mai sus. // k este nodul terminal de indice minim căutat MA := MA . Fiecare şi-a reconstituit la un moment dat arborele genealogic şi. An. Fig. Arborii A1. end. Definiţia este recursivă. În multe alte exemple îi veţi întâlni pe parcursul acestei cărţi..2. A2. Rădăcina arborelui este unită prin muchii de rădăcinile arborilorA1. A2. astfel încât anumite vârfuri să fie subordonate altora..ai] end. 1.. Definiţie Un arbore cu rădăcină este o mulţime finită de noduri care fie este vidă fie .[ai]. numărul de subarbori nevizi ai unui nod fiind 13 . Arborii cu rădăcină sunt o prezenţă cotidiană.. -toate celelalte noduri sunt partiţionate în n ≥ 0 clase A1. .. după cum vom vedea. //afişez muchia [k.//calculez k. . fiecare clasă fiind un arbore cu rădăcină. write(k. ai. . Un alt exemplu este modul de organizare a competiţiilor sportive sau organigrama unei întreprinderi. while k in MA + MB do inc(k).

Dacă un nod nu are descendenţi el se numeşte nod terminal sau frunză.. 9 sunt fraţi..considerăm că rădăcina r se situează pe nivelul 0. 9 sunt noduri terminale. ... iar descendenţii nodului 4 sunt nodurile 7. r2.. rn vor constitui nivelul 1 în arbore. Dacă y este un ascendent al lui x. În exemplul de mai sus. 6. .. Două noduri care au acelaşi părinte se numesc fraţi..d. rn respectiv rădăcinile arborilor A1. A2. iar rădăcina r reprezintă părintele nodurilor r1. Arbori binari O clasă foarte importantă de arbori cu rădăcină o constituie arborii binari. vor constitui nivelul i+1. Să observăm că definiţia conduce la o ierarhizare a nodurilor arborelui : . 1. An..m. ş. În plus...3. 4 este un ascendent al lui 8. r2. se numesc fiii nodului rădăcină. Mai exact. Nodurile r1. 3. Să observăm că orice nod x poate fi atins din rădăcină pe un drum unic. Nivelul maxim din arbore va constitui înălţimea (adâncimea) arborelui respectiv. fiii nodurilor de pe nivelul i≥ 0. Nodurile 5.a. r2. Orice nod y care se găseşte pe drumul unic de la r la x se numeşte ascendent (strămoş) al lui x.. rn.numit gradul nodului respectiv. . 8. fie constă 14 . 8. 7. r2. 9. rădăcina fiind singurul nod din arbore care nu are părinte. Nodurile 8. toţi descendenţii unui nod x sunt nodurile din subarborele cu rădăcina x.. Fiecărei muchii din arbore îi putem asocia o orientare de la părinte spre fiu. Putem defini recursiv arborii binari astfel : Definiţie Un arbore binar este un arbore care fie este vid. Fig.. atunci x se numeşte descendent al lui y.. Un arbore binar este un arbore cu rădăcină în care gradul oricărui vârf este cel mult egal cu doi. rn. De exemplu.. . nodurile r1.dacă notăm cu r1. . .

8. Vom deosebi între arborii binari câteva clase speciale: 1. rădăcina lui se numeşte fiul stâng al rădăcinii.dintr-un nod rădăcină şi doi arbori binari disjuncţi numiţi subarborele stâng. 9. Arbori binari stricţi sunt arborii binari în care orice vârf are gradul zero (este terminal ) sau doi (are exact doi fii). arborii din figura 9 nu sunt arbori binari stricţi (nodurile 2 şi 6 având un singur fiu). dacă subarborele drept este nevid. Arbori binari plini sunt arbori binari care au 2k-1 vârfuri 15 . A2 = subarbore drept. rădăcina lui se numeşte fiul drept al rădăcinii. este un arbore binar strict. sunt doi arbori binari distincţi. În continuare. 10. 2. Se face o distincţie clară între subarborele drept şi cel stâng. De exemplu. A1 = subarbore stâng. Fig. De exemplu. Analog. dar Fig. terminologia folosită la arbori cu rădăcină se va aplica şi la arbori binari. Dacă subarborele stâng este nevid. Fig. respectiv subarborele.

. n+1. 11.. Construim arborele binar plin cu 2k+1-1 noduri şi eliminăm de pe ultimul nivel nodurile 2k+1-1. 3. 5. . 1.dispuse pe nivelurile 0. pentru a construi un arbore binar complet cu n noduri.. De exemplu. 12.sunt arbori binari cu n vârfuri dispuse pe n niveluri. De exemplu. Mai exact. De exemplu. De exemplu. . determinăm k astfel încât 2k ≤ n < 2k+1 ⇔ k = [log2n]. arborele binar complet cu 5 vârfuri se obţine prin eliminarea vârfurilor 7 şi 6 din arborele binar plin cu înălţimea 2 : Fig. 2k+1-2. Arbori binari echilibraţi . astfel încât pe fiecare nivel i se găsesc 2i vârfuri. 13. 16 .sunt arbori binari în care.. 4. Fig.. . Arbori binari degeneraţi. pentru orice nod. k-1. arborele binar plin cu înălţimea 2 este: Fig. Arborii binari compleţi sunt arbori binari care se obţin dintr-un arbore binar plin prin eliminarea din dreapta către stânga a unor noduri de pe ultimul nivel. numărul nodurilor din subarborele drept şi numărul nodurilor din subarborele stâng diferă cu cel mult o unitate.

Numărul maxim de noduri de pe nivelul i al unui arbore binar este 2i. numărul total de noduri n= n0+n1+n2. 1.3. Deci.E. Q. cu n1 numărul de noduri de grad 1 şi cu n2 numărul de noduri de grad 2. Din ipoteza inductivă. P(0) Pe nivelul i = 0 se găseşte un singur nod (rădăcina). Proprietatea 3.E. Numărul maxim de noduri într-un arbore cu înălţimea h va fi: h i h+1 i=0 ∑2 = 2 −1 Q.1 Proprietăţi ale arborilor binari Proprietatea 1. P(k) Presupunem că numărul maxim de noduri de pe nivelul k este 2k . deci. Pe nivelul k+1 se găsesc fiii nodurilor de pe nivelul k. pe nivelul k se găsesc cel mult 2k noduri.D. 14. Numărul maxim de noduri într-un arbore cu înălţimea h este 2h+1-1. Demonstraţie: Notăm cu n0 numărul de noduri terminale. În orice arbore binar nevid cu n0 noduri terminale există n0-1 noduri de grad 2. Proprietatea 2.Fig. conform propoziţiei anterioare. conţine 2i noduri. iar fiecare nod poate avea cel mult doi fii. Demonstraţie: Vom proceda prin inducţie după numărul nivelului. deci pe nivelul k+1 se găsesc cel mult 2*2k = 2k+1 noduri.D. 17 . P(k+1) Vom demonstra că pe nivelul k+1 sunt cel mult 2k+1 noduri. Demonstraţie: Numărul maxim de noduri într-un arbore cu înălţimea h se obţine atunci când fiecare nivel i este plin.

Îndepărtând din An fiii nodului x. In = In-1+(d-1) (în An nodul x este intern). a ultimului nivel. are o singură muchie orientată spre el. care. eventuală. nodurile sunt dispuse pe niveluri astfel încât fiecare nivel să fie plin. Într-un arbore binar cu n noduri interne.E. cu n-1 noduri interne. Demonstraţie: Vom proceda prin inducţie după n. rezultă că m = n1+2n2. 18 . P(0) Într-un arbore cu 0 noduri interne (vid sau format numai din rădăcină) E = I = 0. E = I+2n. dar nodul x nu. cu excepţia rădăcinii.D.Dacă numărăm muchiile dintr-un arbore binar. cu n noduri interne. Q. observăm că fiecare nod. Dacă notăm cu d. Definim lungimea drumurilor interne (I) ca fiind suma lungimilor drumurilor de la rădăcină la noduri neterminale (interne) şi lungimea drumurilor externe (E) ca fiind suma lungimilor drumurilor de la rădăcină la noduri terminale (frunză sau externe). Dar orice muchie provine de la un nod de grad 1 sau 2. Q. P(n-1) Presupunem că într-un arbore binar An-1. Fie An un arbore binar cu n noduri interne. Q. nodul x se transformă în nod terminal. lungimea drumului de la rădăcină la x fiind d-1). obţinem relaţiile : En = En-1+2d-(d-1) (în An nodurile eliminate sunt terminale. din modul de construcţie. Există în An un nod intern x care are drept fii două noduri terminale. Din propoziţia inductivă rezultă că în arborele A n-1. are înălţimea [log2n].D. Deci En = In-1+2(n-1)+d+1 = In-d+1+2n-2+d+1 = In+2n. Deci arborele binar cu n noduri de înălţime minimă este arborele binar complet cu n vârfuri. Din n0+n1+n2 = n şi n1+2n2 = n-1 ⇒ n2 = n0-1. Demonstraţie: În cazul cel mai favorabil. are loc relaţia En = In+2n.E. are loc relaţia En-1 = In-1+2(n-1). numărul nodurilor interne. cu excepţia. En-1 = In-1+2(n-1). Un arbore cu n vârfuri are înălţimea cel puţin egală cu [log2n]. Notând m numărul de muchii obţinem n = m+1. Proprietatea 5. deci obţinem un arbore An-1 cu n-1 noduri interne. P(n) Vom demonstra că într-un arbore binar An.E.D. Proprietatea 4. lungimea drumului de la rădăcină la nodurile eliminate.

Urm: ListaFii..4. arborele din figura de mai jos. Fiu: array[1.NrMaxFii] of Arbore. numărul maxim de fii este. Într-o astfel de reprezentare risipa de memorie este foarte mare. 19 . Declararea acestei structuri în secţiunea type în limbajul Pascal va fi : ListaFii = ^Fiu. Ref: ListaFii. NodArbore = record Inf: TipInformaţie. Reprezentarea arborilor 1..4. În plus. end.. putem reprezenta referinţele spre fii printrun vector cu n componente. necunoscut. în fiecare nod alocăm memorie pentru numărul maxim de referinţe către fii. în general.. Acest neajuns ar putea fi eliminat folosind în locul vectorului de referinţe (cu număr a priori fixat de componente) o listă simplu înlănţuită în care să reţinem toţi fiii nodului respectiv. De exemplu. Structura unui nod va fi : Informaţie Fiu1 Fiu2 . Reprezentarea cu referinţe descendente Pentru fiecare nod din arbore vom reţine informaţia asociată nodului şi referinţe către fiii săi. Fiun Declararea acestei structuri în secţiunea type în limbajul Pascal este : Arbore = ^NodArbore. end.1. Arbore = ^Nod Arbore. Dacă presupunem că gradul oricărui nod este cel mult egal cu n... end. NodArbore = record Inf: TipInformaţie. Fiu = record F: Arbore.1.

2. Dacă arborele este reprezentat prin referinţe descendente.4. va fi reprezentat prin : Fig. dar pentru a avea acces la toate nodurile arborelui trebuie să reţinem toate nodurile terminale. De exemplu. 15. Tata: Arbore. Reprezentarea cu referinţe ascendente În această reprezentare. Arbore = ^NodArbore. Mai simplu. atunci este suficient să reţinem rădăcina arborelui pentru a avea acces la toate nodurile acestuia. putem utiliza doi vectori în care pentru fiecare nod reţinem informaţia.16. pentru fiecare nod din graf reţinem pe lângă informaţia aferentă. o legătură spre nodul părinte. NodArbore = record Inf: TipInformaţie. respectiv nodul părinte. pentru arborele din figura 15 vom obţine reprezentarea : Inf a b c d e f g h i j k l m Tata a a a b b c d d d e e h 20 .Fig. 1. end. Această reprezentare este mai compactă.

O astfel de reprezentare este utilă pentru reprezentarea mulţimilor disjuncte cu ajutorul arborilor şi o rezolvare eficientă a problemelor de reuniune a două mulţimi şi de determinare a mulţimii căreia îi aparţine un element dat. obţinem un arbore binar în care pentru fiecare nod.4. 17. Figura de mai jos ilustrează aceasta transformare. end. Între cele două grafuri există o corespondenţă biunivocă. FiuSt. Pentru arborele din figura 15 obţinem: Fig. Reprezentarea Fiu-Frate. Arbore = ^NodArbore. NodArbore = record Inf: TipInformaţie. 1. fiul drept este fratele lui din dreapta cel mai apropiat. 18. Pentru fiecare nod reţinem fiul cel mai din stânga şi fratele lui din dreapta cel mai apropiat. Fig. FrateDr: Arbore. Reprezentarea arborilor binari 21 . Rotind această reprezentare cu 45° în sensul acelor de ceasornic. 1.5.3.

pentru fiecare nod reţinem. st.1. . Arborele binar va fi referit prin intermediul rădăcinii. .2. Pentru aceasta. end.. numărul de noduri din arbore.5. fiul stâng al lui x este st( x) = 2x. vom numerota nodurile astfel : . prin inducţie după numărul nodului x. dacă 2x≤ n nu dacă 2x> n 2.cele 2i noduri de pe nivelul i sunt numerotate 2i. legăturile dintre noduri fiind implicite. Pentru fiecare nod reţinem într-un vector doar informaţia asociată nodului. dacă 3 ≤ n. şi 2. 1 M Q tata( x) = N există. dacă 2 ≤ n dr(1) = 3 = 2x+1. 1. Această numerotare ne permite să deducem legăturile existente între nodurile arborelui. părintele nodului respectiv. pe lângă informaţia asociată nodului. fiul drept al lui x este . P(1) Dacă x = 1. şi 2.1. dr. În această reprezentare.5. părinte: ArboreBinar. părintele lui x este L /2O dacă x> x P . dacă x=1 nu { { Demonstraţie: Vom demonstra relaţiile 1. relaţia 3. şi 2.rădăcina este numerotată cu 1. 2i+1.există.pe ultimul nivel nodurile sunt numerotate până la n. . Acest tip de reprezentare este convenabil pentru arbori binari compleţi. sunt îndeplinite pentru nodul x. . rădăcina subarborelui drept şi dacă este necesar. ArboreBinar = ^NodArboreBinar. Propoziţie Următoarele relaţiii sunt valabile pentru orice nod x din arbore : 1.. P(x) Presupunem că relaţiile 1. Reprezentarea secvenţială. st(1) = 2 = 2x. Reprezentarea înlănţuită. 22 R | S | T . fiind o consecinţă imediată a relaţiiilor 1. rădăcina subarborelui stâng. 2i+1-1 de la stânga la dreapta(i > 0). dacă 2x+1> n 3. NodArboreBinar = record c: TipInformaţie. dacă 2x+1≤ n dr ( x) = 2x+1 nu există.

şi 2. adică dacă 2x+2≤ n st( x + 1) = 2x+2. 1. begin * { 2 dr ( x + 1) = {x+3. Vom prezenta o procedură de creare a unui arbore binar echilibrat.1. nu există.6. este inadecvată pentru inserări şi ştergeri de noduri. altfel cei doi subarbori au un număr egal de noduri. dr(x) = 2x+1. 1. Din ipoteza inductivă. dacă 2x+3 ≤ n.6. ca orice reprezentare secvenţială. Se poate utiliza reprezentarea secvenţială şi pentru arbori binari oarecare. dacă 2x+2> n şi dacă 2x+3≤ n dacă 2x+3> n Fiul stâng al nodului x+1 este precedat de fiul drept al nodului x. Fiul drept al lui x+1 este succesorul lui st(x+1). evident. nu există. nefiind necesară decât memorarea informaţiilor nodurilor. dacă 2x+2 ≤ n. 23 . deci st(x+1) = 2x+1+1 = 2x+2. Programul Operaţii-pe-Arbori-Binari implementează operaţiile pe arbori binari prezentate. alţi algoritmi de creare fiind prezentaţi în capitolele următoare. pentru x+1. vom utiliza reprezentarea înlănţuită a arborilor binari. completând arborele cu noduri fictive până la un arbore binar complet. Operaţii elementare pe arbori binari* În cele ce urmează.D. Dacă n este par numărul nodurilor din subarborele stâng va fi cu o unitate mai mare decât numărul nodurilor din subarborele drept. În plus. deci dr(x+1) = 2x+2+1 = 2x+3. dar în acest caz o mare parte din vectorul ce conţine informaţiile nodurilor rămâne neutilizată. Algoritmul de creare depinde în mod esenţial de tipul arborelui binar pe care dorim să-l construim. Crearea unui arbore binar. Pentru a crea un arbore binar echilibrat cu n vârfuri se stabileşte un vârf rădăcină. Deci pentru arbori binari compleţi această reprezentare este ideală. function CreareArboreBinarEchilibrat(n: byte): ArboreBinar.P(x+1) Demonstrăm relaţiile 1. // funcţia întoarce adresa rădăcinii unui arbore binar echilibrat cu n //vârfuri var rad: ArboreBinar.E. se construieşte un arbore binar echilibrat cu [n/2] vârfuri ca subarbore stâng şi un arbore binar echilibrat cu n-1-[n/2] vârfuri ca subarbore drept. Q.

St := CreareArboreBinarEchilibrat(n div 2). apoi cel drept rad^.dr).if n = 0 then //arborele este vid CreareArboreBinarEchilibrat := nil else begin new(rad) //aloc zonă de memorie pentru rădăcina arborelui readln(rad^.Inf). se vizitează mai întâi rădăcina. inordine. Pentru a parcurge un arbore binar în preordine. procedure Preordine(rad: ArboreBinar). begin if rad ≠ nil then begin write(rad^. Există mai multe posibilităţi de parcurgere a arborilor.inf). Parcurgerea arborilor binari Parcurgerile sunt cele mai frecvent utilizate operaţii pe arbori. rad^.st). 24 . //parcurg subarborele stâng Preordine(rad^. //parcurg subarborele drept end. postordine) sau pe niveluri.//citesc informaţia rădăcinii arborelui // creez subarborele stâng.6. a) Parcurgerile în adâncime În toate cele trei tipuri de parcurgere în adâncime se vizitează mai întâi subarborele stâng. //vizitez rădăcina Preordine(rad^. procedurile de parcurgere în adâncime necesită o stivă. în scopul prelucrării informaţiei asociate nodului. apoi subarborele drept. fie iterativ. apoi se parcurge în preordine subarborele drept.n div 2 -1 ). Diferenţa constă în poziţia rădăcinii faţă de cei doi subarbori. se parcurge în inordine subarborele stâng.în adâncime (preordine. se parcurge în preordine subarborele stâng. end. se vizitează radăcina. A parcurge un arbore înseamnă a vizita fiecare nod al arborelui o singură dată. 1.2. cât şi subarborii sunt prelucraţi în acelaşi mod. dar în toate cazurile atât arborele. Pentru a parcurge în inordine un arbore binar. Fie scrise recursiv. CreareArboreBinarEchilibrat := rad end end. Dr := CreareArboreBinarEchilibrat(n . apoi se parcurge în inordine subarborele drept.

end. Stivă = ^NodStivă.procedure Inordine(rad: ArboreBinar). begin S := nil. write(rad^. NodCurent: ArboreBinar. apoi cel drept. end. begin if rad ≠ nil then begin Postordine(rad^. p: Stivă. procedure InordineIterativ (rad: ArboreBinar). write(rad^. procedure Postordine(rad: ArboreBinar). Pentru a parcurge în postordine un arbore binar. Pentru a simula recursia vom folosi o stivă S la care vom adăuga sau şterge elemente în acelaşi mod ca în procedura recursivă.st). repeat while NodCurent ≠ nil do begin //adaugă nodul curent în stiva S new(p) 25 . end. se parcurge în postordine subarborele stâng.inf). vom prezenta şi o variantă iterativă de parcurgere în inordine a unui arbore binar.dr). NodStivă = record Inf: ArboreBinar. Inordine(rad^. Urm: Stivă. NodCurent := rad. apoi se vizitează rădăcina.dr). end. begin if rad ≠ nil then begin Inordine(rad^.st). Pentru a înţelege mai bine operaţia de parcurgere. end. Postordine(rad^.inf). // procedura parcurge iterativ în inordine arborele cu rădăcina rad var S.

apoi cel drept şi se continuă în acest mod vizitând nodurile de pe fiecare nivel de la stânga la dreapta. //eliberează zona de memorie a lui p until (S = nil) and (NodCurent = nil) end. Urm: Coadă. vom extrage un nod.Inf^. p^. Observaţie Fiecare nod din arbore este plasat şi şters din stivă o singură dată. apoi fiul stâng al rădăcinii. vom utiliza o coadă. S := S^. p: Coadă.Inf := NodCurent.Dr dispose(p). b) Parcurgerea pe niveluri Se vizitează întâi rădăcina.Urm. Spaţiul suplimentar necesar depinde de înălţimea arborelui. S := p.inf) NodCurent := p^. write(p^. Pentru a realiza acest mod de parcurgere. la fiecare pas. NodCoadă = record Inf: ArboreBinar.p^. deci timpul necesar parcurgerii inordine este de O(n). pe care o iniţializăm cu rădăcina arborelui şi din care.Urm := S. end. SfC. procedure ParcurgerePeNiveluri (rad: ArboreBinar) //procedura parcurge pe niveluri arborele cu rădăcina rad var C.St if S ≠ nil then //extrage un element din stivă begin p := S. îl vizităm şi inserăm în coadă fii săi. Coadă = ^NodCoadă. deci în cazul cel mai defavorabil este de O(n). begin if rad ≠ nil then //arborele este nevid begin new(C) // iniţializez coada cu rădăcina arborelui 26 . //rădăcina subarborelui stâng devine nod curent NodCurent := NodCurent^. dacă aceştia există.

end end end.Inf := p^.Inf^. C^. q^. while C ≠ nil do // coada nu este vidă begin p := C. Dacă arborele este vid.3.Inf^. q^.Urm := q.Dr ≠ nil then begin //adaug fiul drept în coadă new(q).Urm := nil. SfC^.Urm //extrag din coadă nodul p dispose(p).Inf := p^. astfel putem calcula înălţimea arborelui ca fiind maximul dintre înălţimile subarborilor rădăcinii plus nivelul pe care se află rădăcina.Dr. Observaţie Mai întâi am inserat în coadă fiii nodului ce urmează a fi vizitat şi apoi am extras efectiv nodul respectiv din coadă. // funcţia întoarce înălţimea arborelui binar cu rădăcina rad 27 .St. if p^. C := C^.Inf^.Urm := q. vom considera că înălţimea sa este –1. q^. SfC^. end. write(p^. pentru a evita inserarea unui nod într–o coadă vidă. Determinarea înălţimii unui arbore.St ≠ nil then begin //adaug fiul stâng în coadă new(q). 1.C^. if p^. q^.Inf^. function Înălţime (rad: ArboreBinar): integer.Urm := nil.Inf := rad.6.Inf). end. SfC := C. SfC := q.Urm := nil. SfC := q.

parcurgerea în inordine.c) //au aceeaşi informaţie în rădăcină and Egali(rad1^. H subarborele drept. care întoarce cel mai mare dintre cele două argumente ale sale.E.H.H. Pentru a determina structura subarborelui stâng.G. deducem că nodurile C. Egalitatea a doi arbori binari.B. // respectiv rad2 sunt egali.St. Spunem că doi arbori binari sînt egali dacă au aceeaşi structură şi conţin aceleaşi informaţii în nodurile corespondente. fie A. E.G. Înălţime(rad^. Analizînd parcurgerea în preordine. Aplicaţie* Se dau secvenţele obţinute prin parcurgerile în preordine şi în inordine ale unui arbore binar. rad2^.4.B.St) //subarborii stângi egali and Egali(rad1^. rad2: ArboreBinar): boolean.D.Dr.E. //funcţia întoarce true dacă arborii cu rădăcinile rad1.st).C. iar subarborele drept al lui D din * Programul Construcţie-Arbore-Binar-cu-Secvenţele-Preordine-Inordine-Date generează un arbore binar pentru care se cunosc parcurgerile în preordine şi inordine. iar D.F. De asemeni. iar din parcurgerea în inordine deducem că C este fiul stâng al lui B.F. function Egali (rad1. 28 . respectiv a subarborelui drept.Dr) // subarborii drepţi egali end. Construiţi arborele binar corespunzător. În mod similar. De exemplu. procedăm analog: din parcurgerea în preordine deducem că B este rădăcina subarborelui stâng. F.A. Am presupus cunoscută funcţia max. iar din parcurgerea în inordine că subarborele stâng al lui D este format numai din nodul E. analizând parcurgerea în inordine.parcurgerea în preordine şi C. 1. altfel întoarce false begin Egali := (rad1 = nil) and (rad2 = nil) //ambii sunt vizi sau or (rad1 ≠ nil) and (rad2 ≠ nil) // ambii sunt nevizi şi and (rad1^.c = rad2^. G. deducem că nodul A este rădăcina.D.6. rad2^. B vor constitui arborele stâng. pentru subarborele drept deducem din parcurgerea în preordine că D este rădăcină.dr))+ 1 end.begin if rad = nil then // arbore vid Înălţime := –1 else Înălţime := max(Înălţime(rad^.

arborele binar corespunzător este unic. P(1) Dacă arborele are un singur nod.2.. Obţinem două perechi de secvenţe preordine-inordine de lungime cel mult n. celelalte n noduri fiind distribuite în subarbori: toate nodurile situate în stânga rădăcinii în parcurgerea în inordine vor constitui subarborele stâng. adică pentru orice pereche de secvenţe inordine–preordine de lungime k. nodurile situate în dreapta rădăcinii în parcurgerea inordine vor constitui subarborele drept. Demonstraţie: Vom proceda prin inducţie completă după numărul de noduri.nodurile F. . rădăcina. determină în mod unic 29 . 19. G. Procedeul se repetă pînă cînd obţinem întreg arborele. H.. P(n+1) Să demonstrăm că orice pereche de secvenţe preordineinordine de lungime n+1 determină în mod unic un arbore binar. Succesiunea operaţiilor este ilustrată în figura 19: Fig. Să considerăm o pereche de secvenţe preordine-inordine de lungime n+1.n} afirmaţia este adevărată. Propoziţie Succesiunile de noduri obţinute prin parcurgerile în inordine şi în preordine ale unui arbore binar definesc în mod unic structura arborelui. afirmaţia este evidentă. Primul nod din parcurgerea în preordine este în mod necesar rădăcina arborelui.. care din ipoteza inductivă. P(n) Presupunem că pentru ∀k∈{1.

. Numărarea arborilor binari* * Programul Numar-Arbori-Binari-Distincţi afişează numărul arborilor binari 30 .n).dr^ := ConstrArb(rad+ IPozRad-st+ 1. cum rădăcina este în mod unic determinată. Astfel. function ConstrArb (rad.. este suficient să reţinem într-un vector global i indicii vârfurilor în ordinea în care au fost atinse în inordine.st^ := nil else // i[ st. dr): ArboreBinar. // în subarborele stâng au fost IPozRad-st+ 1 vârfuri end. IPozRad+ 1.E. //reţinem drept informaţie numărul asociat nodului IPozRad := st. Vom descrie o funcţie recursivă ConstrArb. st.st^ := ConstrArb(rad+ 1. //aloc memorie pentru rădăcina arborelui r^. // determin poziţia rădăcinii arborelui în parcurgerea inordine while i[IPozRad] ≠ rad do inc(IPozRad). dr] conţine subarborele drept r. respectiv cel drept şi în consecinţă. IPozRad-1] conţine subarborele stâng r.c := rad.D.dr^:= nil else // i[ IPozRad+ 1. IPozRad-1). Q.7. apelăm ConstrArb(1. IPozRad: byte. 1. dr). Iniţial. st. deducem că perechea de secvenţe preordineinordine de lungime n+1 determină în mod unic un arbore binar cu n noduri. if IPozRad = dr then //subarborele drept este vid r.subarborele stâng.1. care determină arborele binar corespunzător unei perechi de secvenţe preordineinordine date. Pentru simplificare. vom considera că nodurile arborelui sunt numerotate în preordine de la 1 la n. if IPozRad = st then //subarborele stâng este vid r. begin new(r). //functia întoarce rădăcina arborelui unic determinat de parcurgerile //inordine-preordine //rad este indicele rădăcinii arborelui //st şi dr sunt limitele între care se găseşte parcurgerea inordine a //arborelui în vectorul i var r: ArboreBinar.

Pentru n= 3. b0 = 1. făcând abstracţie. 21.Se pune problema determinării numărului de arbori binari distincţi cu n noduri. Fig. bineînţeles de numerotarea nodurilor. 20. Evident. | dac\ n=1 | bn = S |n−1 | ∑ bibn−i−1. există 5 astfel de arbori. respectiv n-i-1 noduri (0 ≤ i < n). Pentru n= 0 sau n= 1 există un singur arbore binar. 31 . Dacă n= 2. obţinem : i ∑ bnxn = x∑ ∑ (bxi )(bn − i − 1xn− i −1) n≥1 n≥1 i = 0 n−1 i =0 n−1 distincţi cu n vârfuri date. Pentru n > 0 arborii sunt formaţi din rădăcină şi doi subarbori cu i. R |1. Notăm cu bn numărul arborilor binari distincţi cu n noduri. Fig.obţinem : bnxn = x∑ (bxi )(bn − i − 1xn− i −1) i Sumând după n ≥ 1. există doi arbori binari distincţi. înmulţind ambii membri cu xn . dac\ n> 1 |i=0 | T Pentru a obţine numărul arborilor binari distincţi cu n noduri este suficient să rezolvăm această relaţie de recurenţă. Să considerăm funcţia B( x) = ∑ bnxn n≥ 0 Din relaţia de recurenţă.

obţinem: B( x) = ∑ 1 1 1 ( −1)....(1− 2n) ⇔ 2n+1 (n + 1)! (2n − 1)(2(n − 1) − 1).(2 − 1) bn = 2n ⇔ (n + 1)! bn = (−1)n 22n+1 1 (2n ⋅ n!)(2n − 1)(2(n − 1) − 1).( − n) 2 n 2n+1 2 2 bn = (−1) 2 ⇔ (n + 1)! 1 (1− 2)(1− 2⋅ 2)......( − n+1) 1 ∑ 2 2 n!2 (−1)n+122n xn ⇔ 2x n≥1 1 1 1 B( x) = ∑ n≥1 1 1 1 ( −1).( − m) 2 2 2 ( m+1)! (−1)m22m+1 xm) m0 ≥ Cum bn este coeficientul lui xn în B(x) obţinem 1 1 1 ( − 1).. Am demonstrat că fiecărui arbore binar îi corespunde o 32 .... Rezolvând această ecuaţie de grad II obţinem : 1 1− 1− 4x 1 B( x) = ⇔ B( x) = (1− (1− 4x)2 ) 2x 2x Dezvoltând binomial (1-4x)1/2 ...Obţinem B(x)-b0 = x*B2(x) ⇔ xB2(x) . obţinem: 1 1 1 ( −1).B(x)+1 = 0..( − n+1) 1 2 2 2 B( x) = (1− ∑ (−4x)n ) ⇔ n! 2x n≥ 0 B( x) = ( −1).(2 − 1) ⇔ n+ 1 n!⋅ n! (2n)! n bn = n11⋅ n!⋅n! ⇔ bn = n11C2n + + Numărul arborilor binari distincţi cu n vârfuri va fi aproximativ bn = F I b = OG J H K n n 4 3/ 2 n Observaţii 1..( − n+1) 2 2 2 n! (−1)n+122n−1 xn−1) Notând n-1 cu m.

... Păduri 33 R dacă n = 1 |1. Produsul M0× M1× . P (n) = S−1 n |k∑0P (k)⋅P (n−k−1)...n într-o stivă şi ştergându-le în toate modurile posibile).× Mk)(Mk+1× . Cum înmulţirea matricilor este asociativă.. Acestei asocieri i se poate pune în corespondenţă un arbore binar: Fig. (M0× M1) × (M2× M3).Mn. Notăm cu P(n) numărul de moduri distincte în care putem calcula produsul M0× M1× ... Pentru n = 3 există cinci posibilităţi : ((M0× M1) × M2) × M3. O problemă care are în mod surprinzător legătură cu cele precedente este calculul produsului a n+1 matrici. M0× ((M1× M2) × M3 ). (M0× (M1× M2)) × M3. Pentru n = 1 există o singură posibilitate.2. M0× (M1× (M2× M3)). 22. rezultă că arborii binari sunt definiţi de permutările inordine distincte (permutările distincte ce se pot obţine trecând numerele 1.. Considerând nodurile numerotate în preordine. am dori să ştim în câte moduri putem calcula produsul M0× M1× ...× Mn poate fi împărţit într-un produs de două produse de matrici : (M0× M1× . M0.M1....singură pereche de secvenţe preordine-inordine... Deci numărul de parantezări posibile pentru produsul a n+1 matrici coincide cu numărul arborilor binari distincţi cu n noduri. 1. Pentru n = 2 există două posibilităţi: (M0× M1) × M2 sau M0× (M1× M2).8... dacă n>1 |= T .× Mn. Deci numărul permutărilor inordine de n elemente este 1 n n+1C2n 2.× Mn ).× Mn.

24. Atunci arborele binar corespunzător pădurii.are rădăcina egală cu rădăcina lui A1.. iar subarborele drept este arborele binar corespunzător pădurii formată din arborii A2. Îndepărtând rădăcina din orice arbore obţinem o pădure formată din subarborii rădăcinii. 34 . 2. transformăm arborii din care este constituită pădurea în arbori binari. Definiţie Fie A1.... An.. A2. B(A1.Definiţie O pădure este un ansamblu de n ≥ 0 arbori disjuncţi. . An arborii unei păduri. .. De exemplu. Apoi construim arborele binar corespunzător pădurii.. A2. utilizând câmpul frate al rădăcinii fiecărui arbore. utilizând reprezentarea fiu-frate. subarborele stâng este arborele corespunzător pădurii formată din subarborii lui A1. An) este: 1.vid. 23. dacă n = 0. pentru pădurea din figura 24 arborele binar asociat este Fig.. Pentru aceasta. . Fig. De exemplu. Orice pădure poate fi reprezentată ca un arbore binar. Operaţiile de parcurgere a unei păduri se reduc la parcurgerea arborelui corespunzător..

Demonstrăm că po este o m-ponderare maximală pentru arborele T.Fig. suma ponderilor vârfurilor de pe orice drum de la rădăcină la un vârf terminal. să fie cel puţin egală cu [log2n]+1. Iaşi 1995Un arbore binar strict se numeşte m-ponderat dacă fiecare nod i are asociată o pondere p[i]. Fie T un arbore binar strict cu n vârfuri terminale. astfel încât pentru orice nod terminal t suma ponderilor din nodurile aflate pe drumul de la rădăcină la nodul t este egală cu m. Să se scrie un program care pentru n si m daţi determină un arbore binar strict m-ponderat cu n noduri terminale T* astfel încât: Pn.m(T) arbore binar strict m-ponderat cu n noduri T terminale} Soluţie: Pentru ca problema să admită soluţie trebuie ca pentru orice drum de la rădăcină la un nod terminal să putem asocia nodurilor ponderi ≥ 1. Înălţimea minimă a unui arbore cu n vârfuri terminale este h=[ log2n]. cu valori între 1 şi m-1. Definim Pn. Pentru a asocia ponderi este necesar ca m. -deoarece suma ponderilor de pe orice drum de la rădăcină la un vârf terminal trebuie să fie egală cu m.1.9. asociem fiecărui nod terminal o pondere egală cu m-lungimea drumului de la rădăcină la nodul terminal respectiv.m(T*)= max{Pn. 35 . Construim o mponderare po a arborelui T astfel: -asociem fiecărui nod interior ponderea 1. Observaţii 1. Probleme rezolvate 1. Deci condiţia necesară pentru ca problema să admită soluţie este m ≥ [log2n]+1. 1. 25. Arbori binari m-ponderaţi -Olimpiada de informatică faza judeţeană.9.m(T) ponderea unui arbore binar strict cu n noduri terminale m-ponderat ca fiind suma ponderilor ataşate nodurilor din T.

p’[z] = p[z]+p[x]-1. Modificând succesiv ponderile nodurilor interioare de sus în jos. ∀T arbore binar strict. Fie T un arbore binar strict cu n vârfuri terminale care nu este complet şi fie x şi y două vârfuri terminale fii ai aceluiaşi nod interior. situate pe nivelul i. Fig. Fie y şi z cei doi fii ai lui x. 36 . Atunci P’(T) = P(T)-p[x]-p[y]-p[z]+p’[x]+p’[y]+p’[z] ⇒ P’(T) = P(T) -p[x]-p[y]-p[z]+1+ p[y]+p[x]-1+ p[z]+p[x]-1 ⇒ P’(T) = P(T)+p[x]-1 ⇒ P’(T) > P(T). arborele binar strict cu n vârfuri terminale care maximizează Pn. iar z un nod terminal situat pe nivelul j. pentru implementare alegem reprezentarea secvenţială. pentru n şi m daţi. Rămâne să determinăm. Construim o altă m-ponderare p’ a lui T astfel: p’[x] = 1. Aplicăm succesiv această transformare până când obţinem un arbore binar complet. program arbore_m_ponderat.E.Să considerăm p o m-ponderare oarecare pentru arborele T şi x un vârf interior astfel încât p[x]>1. const NMaxVfT=20. P(T’) = P(T)-2(m-i+1)-1-(m-j+1)+2(m-j)+m-i+2+1 ⇒ P(T’) = P(T)+i-j-1 > P(T). Reprezentarea informaţiilor Arborele căutat fiind complet. p’[y] = p[y]+p[x]-1. Observaţia 1. oferă o modalitate de m-ponderare optimală a unui arbore binar strict dat. Dacă există mai multe astfel de noduri. Deci Po(T) ≥ P(T). obţinem după un număr finit de paşi m-ponderarea po. considerăm un vârf de pe un nivel de rang minim. 26. Demonstrăm că arborele căutat T* este arborele binar complet. ca fii ai nodului z şi reponderăm nodurile.D. uses crt. ∀p o m-ponderare a arborelui T 2. în care toate vârfurile interioare au ponderea 1. astfel încât i-j > 1. Q.m(T). Deci P(T*) > P(T). Mutăm nodurile x şi y de pe nivelul i pe nivelul j+1.

.readln(m).writeln(1). Să se interclaseze cele n secvenţe. gotoxy(pst. write('n='). ordonate nedescrescător. write('m=')..Sn de lungimi respectiv L1.wherey). procedure afisare. pp=42..writeln(p[i]).NMaxVf. for i:=n to 2*n-1 do begin write(i). Pondere').nivel:Vf.NMaxVf=2*NMaxVfT-1. if m<trunc(ln(n)/ln(2))+1 then writeln('Nu exista solutie!') else begin for i:=1 to n-1 do p[i]:=1. p[i]:=m-nivel.wherey). 1. const pst=13. end end.2. type Vf=0.Ln.. readln end.wherey). begin clrscr. gotoxy(pdr. begin writeln('Nodul Fiu stang Fiu drept for i:=1 to n-1 do begin write(i). {nodurile interioare au ponderea 1} for i:=n to 2*n-1 do begin nivel:=trunc(ln(i)/ln(2)). var i:Vf.write(2*i+1).. {nodurile terminale au ponderea egala cu m-numarul nivelului pe care sunt situate} end. end. arbore_ponderat=array[Vf] of word. afisare end.wherey).. pdr=28. Interclasarea optimală a n şiruri ordonate Fie n secvenţe S1.write(2*i).9. var n..L2.. 37 .S2.i..readln(n). gotoxy(pp. gotoxy(pp. p:arbore_ponderat. m:word.

reset(f). i:Secv.l[i]). {numarul de secvente} m. vom utiliza reprezentarea secvenţială. {rezultatul interclasarii} s:array[Secv. 38 . O prima soluţie ar fi să selectăm la fiecare pas articolul cu cheia cea mai mică şi să-l plasăm în şirul rezultat.. j:Ind. Observaţie Fiecare nod din arbore are asociată ca valoare minimul valorilor nodurilor din subarborele corepunzător.{arborele de selectie} j:array[Secv] of Ind.+Ln.{indicii curenti in secvente} procedure citire. Definiţie Numim arbore de selecţie un arbore binar complet în care fiecare nod este cel mai mic dintre fiii săi. Reprezentarea informaţiilor Arborele de selecţie fiind complet. deci algoritmul ar fi de O(n•m). Deci algoritmul va fi de O(m log n).NMaxSecv.{m=numarul total de elemente} o:array[1.k:word. restructurarea arborelui.n). LgMaxSecv=50.{lungimile secventelor} n:Secv. Vom construi arborele de selecţie în mod bottom-up.2*NMaxSecv..Soluţie: 1.'int.{secventele} A:Arbore.. const NMaxSecv=20.in'). Construcţia arborelui de selecţie este de O(n). Arbore=array[Nod] of integer. Vom utiliza un arbore de selecţie. program interclasare_optimala.Ind] of integer.. for i:=1 to n do read(f.LgMaxSecv. var f:text. type Ind=1.. Notăm cu m L1+L2+. Secv=1. care se repetă de m ori. 2. begin assign(f. Pentru selectarea minimului ar fi necesare n-1 comparaţii. apoi la fiecare pas selectăm minimul. Nod=1. var l:array[Secv] of Ind. de O(log n).LgMaxSecv*NMaxSecv] of integer. readln(f.. care este rădăcina arborelui şi restructurăm arborele.

while i<=n-1 do if A[i]=A[2*i] then i:=2*i else i:=2*i+1. close(f). end.1].j[i-n+1]]. procedure afisare. var i.readln(f).frate:Nod. procedure ConstrArbSel. i:=tata. {i este nodul terminal corespunzator secventei din care am luat un element} inc(j[i-n+1]).l[i]+1]:=MaxInt. end. begin {determin secventa corespunzatoare nodului eliminat} i:=1. end. end. for j:=1 to l[i] do read(f. {restauram valorile nodurilor de pe drumul de la nodul i la radacina} while i>1 do begin tata:=i div 2. if i=2*tata then frate:=2*tata+1 else frate:=2*tata. end.tata. begin {constructia arborelui de selectie} for i:=n to 2*n-1 do A[i]:=s[i-n+1. var i:Nod.s[i. procedure restructurare. {initializarea nodurilor terminale} for i:=n-1 downto 1 do if A[2*i]<A[2*i+1] then A[i]:=A[2*i] else A[i]:=A[2*i+1]. 39 . A[i]:=s[i-n+1. readln(f). s[i. {initializez valorile indicilor in secvente} for i:=1 to n do j[i]:=1.j]). if A[i]>A[frate] then A[tata]:=A[frate] else A[tata]:=A[i]. for i:=1 to n do begin m:=m+l[i].

reprezentarea unui arbore binar strict obţinută prin concatenarea în preordine a codificărilor drumurilor de la rădăcină la nodurile terminale.{elementul minim} restructurare.9. G. Codificăm drumurile de la rădăcină la nodurile terminale marcând cu 0 fiecare deplasare la stânga şi cu 1 fiecare deplasare la dreapta. Concatenând codificările în preordine. O reprezentare a arborilor binare stricţi -problemă propusă de Horia Georgescu. readln end. obţinem o reprezentare a arborilor binari stricţi. generaţi arborele corespunzător. afisare. end. begin {program principal} citire. Pentru exemplul din figura 27 codificarea este 00010001010111. 1. writeln.3. 27. for k:=1 to m do begin o[k]:=A[1]. Dacă notăm p secvenţa ce codifică drumul 40 . end. Problemă Data fiind s.10/1993Fie următorul arbore binar strict Fig.var i:word. for i:=1 to m do write(o[i]. situate pe nivelul maxim in arbore.' '). ConstrArbSel.I. fii ai aceluiaşi nod t. y două noduri terminale. begin writeln('Rezultatul interclasarii: '). nr. Soluţie: Fie x.

de la rădăcină la t.j)) and (s[i+2*j+1]='1') 41 . Eliminăm din s secvenţa 0p1.i+j+1. poz:=1. Fig. NodArbore= record st.dr:Arbore end.i. begin lg:=0. lg -lungimea lui p} var i. NrNod. program Generare_Arbore_Binar_Strict. ceea ce corespunde eliminării din arbore a două noduri terminale fii ai aceluiaşi nod. poz -pozitia de inceput a lui p. n.j)=copy(s. {determina cea mai lunga subsecventa p a lui s astfel incat s=αp0p1β. var s:string. s = 000100111. procedure procesare(var poz. atunci şirul s are forma αp0p1β. lg. Obţinem. lg: byte). uses crt. De exemplu. de exemplu. i:=1. f:text. while i+2*j<n do begin while (i+2*j<n) and (s[i+j]<>'0') do inc(j). poz. pentru codificarea de mai sus p = 010. NrTest: byte. p fiind cea mai lungă secvenţă cu această proprietate. Putem construi astfel un drum de la rădăcina arborelui la două noduri terminale fraţi. Am redus problema la generarea unui arbore cu un nod terminal mai puţin. A. pe care îl vom suprapune peste drumul generat anterior. 28. while i<=n-2*lg-1 do begin {caut o secventa p care sa inceapa pe pozitia i de lungime mai mare ca lg} j:=lg+1. if i+2*j<n then if (copy(s. type Arbore=^NodArbore.j: byte. T: Arbore. Determinăm p astfel încât s = αp0p1β.

dr:=x.dr=nil then q^. 42 . x^.st:=x else q^.dr<>nil then begin q:=q^. fii ai nodului q} new(x). procedure ConstrDrum. inc(i) end else gata:=true else if q^.dr:=x.st:=x.st<>nil then begin q:=q^.then begin lg:=j. x^. if q^.dr:=nil. x^. var q. suprapunand eventual peste arborele deja construit} gata:=false.dr.st:=nil.st:=nil. if q^. inc(i) end. q:=x.dr:=nil. begin q:=A. x^.dr:=nil. while i<poz+lg do begin new(x). end. if s[i]='0' then q^. inc(i) end.{gata devine true cand am terminat de parcurs portiunea de drum deja construita in arbore} while not gata and (i<poz+lg) do if s[i]='0' then if q^. i:=poz. x: Arbore. inc(j). x^. end. x^. poz:=i end.st=nil then q^. i: byte.st:=nil. inc(i) end else gata:=true. new(x). gata: boolean. {agat doua noduri terminale.st. {construiesc drumul de la radacina arborelui la nodul tata al nodurilor terminale ce urmeaza sa le agat in arbore.

until n=0.':'). niv+2. ∀i∈{1. niv. NrNod:=1. scrie(x^. afisare.end.niv). . n}. Demonstraţi că în orice graf G = (V. readln..dr:=nil. end. new(A). inc(NrTest). while not seekeof(f) do begin readln(f..d2. scrie(x^.inc(NrNod). st. 1.st..s).'a. scrie(A. A^. end.2. procedure scrie(x: Arbore. d1+d2+. Demonstraţi că în orice arbore există cel puţin două vârfuri terminale.lg).. U) conex. repeat n:=length(s). readln end.+dn = 2n-2). write(NrNod).dr. begin if x<>nil then begin poz:=(st+dr)div 2.. '. procesare(poz. ConstrDrum. end.{generam arborele corespunzator secventei s vide} A^.. begin {program principal} assign(f. poz-1). st.80).. Scrieţi un program de generare a tuturor arborilor cu secvenţa gradelor 43 . delete(s.. dr: byte).poz+lg.st:=nil. Exerciţii 1.lg+2). Calculaţi numărul arborilor cu n vârfuri şi secvenţa gradelor vârfurilor d1. poz+1.10. writeln('Testul nr. end.  ≥  -1. {fisierul de intrare contine mai multe seturi de date de test} reset(f).dn (di ≥ 1. 3.in'). gotoxy(poz.. procedure afisare. 2. NrTest. niv+2. U V 2. dr). begin clrscr.1. var poz: byte.

5. Scrieţi o funcţie care să determine numărul de noduri terminale ale unui arbore binar. 12. NodArbore = record c: TipInf. c). 6.k] of Arbore. 14. Scrieţi o funcţie de creare a unui arbore echilibrat de grad k. pentru orice nod din arbore. 4. Calculaţi numărul arborilor cu n vârfuri.Scrieţi un program care să parcurgă un arbore oarecare în reprezentarea fiu-frate pe niveluri. De exemplu : 44 . d). 9. Scrieţi o procedură iterativă de parcurgere în preordine a unui arbore binar. Scrieţi o funcţie care să determine înălţimea unui arbore de grad k. end. Scrieţi o funcţie de căutare a unei valori de tipul informaţiei asociate nodurilor într-un arbore binar. 13. Aceeaşi problemă pentru parcurgerile în preordine şi în postordine. 11. Scrieţi o funcţie de ştergere a unui arbore binar. Scrieţi o funcţie care să testeze egalitatea a doi arbori de grad k. a). leg: array[1. respectiv parcurgerea în inordine şi parcurgerea pe niveluri. Scrieţi o funcţie de duplicare a unui arbore binar. 15. Generaţi toţi arborii binari distincţi cu n vârfuri. Scrieţi o procedură iterativă de parcurgere în postordine a unui arbore binar. scrieţi un algoritm de generare a arborelui binar corespunzător. dintre care p terminale. 7. 10. Analizaţi complexitatea funcţiei. Scrieţi un algoritm care. dat fiind un arbore binar. b). 8. Fie un arbore cu gradul k şi înălţimea h. Descrieţi algoritmul de parcurgere pe niveluri şi în adâncime a unui arbore de grad k..dată. Definim gradul unui arbore cu rădăcină ca fiind gradul maxim al nodurilor sale. Secvenţele obţinute prin parcurgerile în postordine şi în inordine ale unui arbore binar definesc în mod unic arborele? Dacă da. schimbă fiul stâng cu fiul drept. Care este numărul maxim de noduri din acest arbore ? Reprezentăm fiecare nod al arborelui printr-un articol ce conţine informaţia asociată nodului şi k pointeri spre rădăcinile subarborilor : Arbore = ^NodArbore.

. 17. A2. are forma unui arbore oarecare.Fig. An şi parcurgeţi arborele în preordine. 18. că o convorbire durează un minut şi că fiecare telefonistă. Telefonista de la centrala k. Calculaţi numărul arborilor binari de înălţime h.. 45 . "Problema" telefonistelor O reţea telefonică formată din n centrale numerotate de la 1 la n. să se determine succesiunea propagării în timp a informaţiei şi timpul minim necesar ca toate telefonistele să cunoască vestea pornită de la centrala k. Fie P o pădure. 16. inordine. Calculaţi numărul triangularizărilor posibile pentru un poligon convex cu n vârfuri. . Ştiind că fiecare telefonistă poate vorbi la un moment dat doar cu una dintre vecinele ei. postordine. dacă acesta există. 22. 1 ≤ k ≤ n. Scrieţi o funcţie care să verifice dacă un arbore binar este strict. 19. Scrieţi un algoritm care să determine pentru oricare două vârfuri din pădure cel mai apropiat ascendent comun. Fie P un poligon convex. arborii componenţi fiind reprezentaţi prin referinţe ascendente. Analizaţi complexitatea algoritmului. Demonstraţi că orice arbore binar este 2-colorabil. 20.. după ce a intrat în posesia informaţiei se grăbeşte să o comunice celorlalte vecine ale ei care n-au aflat-o încă. care a intrat în posesia unei informaţii importante. Numim triangularizare a poligonului convex P o mulţime de diagonale care împart poligonul în triunghiuri disjuncte. arde de nerăbdare s-o împărtăşescă tuturor colegelor ei. O diagonală este un segment ce uneşte două vârfuri neadiacente. Scrieţi un program care să construiască arborele binar corespunzător pădurii formate din arborii A1. 21. 29.

n. a[i]. pentru fişierul de intrare: 7 1112223 fişierul de ieşire va conţine: 46 . 'Muchiile arborelui sunt: '). fout: text. 'grade. s := 0. for i := 1 to n do read(fin.. procedure citire. a[VfT] := VfNt. var i: Vf. for i := 1 to n do s := s+d[i]. close(fout). begin assign(fin. dec(d[VfNT]). end. assign(fout. begin citire. writeln(fout).Anexă program Constructie_arbore_cu_secventa_gradelor_data. De exemplu. afisare. reset(fin). end. if s <> 2*(n-1)then writeln(fout. n). fin: text.NMaxVf. '('. var i: Vf. while (VfNt < n) and (d[VfNT] = 1) do inc(VfNt). begin writeln(fout.'Secventa eronata! Suma gradelor trebuie sa fie 2(n-1)!') else for VfT := 1 to n-1 do begin VfNt := VfT+1. readln(fin. VfNt: Vf. rewrite(fout). type Vf = 1. const NMaxVf = 20. procedure afisare. VfT. i. ') '). i. end. d: array[Vf] of Vf. s: byte.out'). d[i]). var a. '.in'). readln(fin). close(fin).'. for i := 1 to n-1 do write (fout. end.'grade.

NrArb: longint. MA := []. const NrMaxVf=10. end. generare(i+1).. while k in MA+MB do inc(k). writeln(fout). for i := 1 to n-1 do MA := MA+[a[i]]. var MB. a: Arbore. procedure determina_arbore. NrArb := 0. '('. '. a[n-1] := n. procedure generare(i: Vf). i.NrArb.out'). end. '. assign(fout.7) (6. readln(n).NrMaxVf. end. MB := []. MB := MB+[k].5) (3. begin inc(NrArb). k: Vf.Muchiile arborelui sunt: (1. MA: set of Vf.'arbnvf.6) (4. k. MA := MA-[a[i]]. 'Arborele nr. write(fout. var n: Vf. begin if i = n-1 then determina_arbore else for j := 1 to n do begin a[i] := j. type Vf = 1. for i := 1 to n-1 do begin k := 1. fout: text.'. close(fout). rewrite(fout).7) program Generare_Arbori_cu_n_Varfuri. 47 . ') '). write(fout. Arbore = array[Vf] of Vf. var j: Vf.4) (2. begin {program principal} write('Introduceti numarul de varfuri '). end.' :').7) (5. end. generare(1). a[i].

end.1) (1. {creeaza un arbore binar echilibrat cu n varfuri} var rad: ArboreBinar.4) (3.2) (2.inf).4) Arborele nr.1) (1. {creez subarborele stang} rad^. procedure preordine(rad: ArboreBinar).1) (1.4) Arborele nr.st := CreareArbore(x div 2). fout: text. 14 :(1.4) Arborele nr. 13 :(2. var n: Vf.4) (3.3) (3. 1 :(2. 8 :(1. dr: ArboreBinar.4) (3.De exemplu.2) (2.4) Arborele nr.4) Arborele nr. 12 :(1.{radacina arborelui care se creaza} begin if x = 0 then {arbore vid} CreareArbore := nil else begin new(rad). type Vf = 0. fin. const NrMaxVf = 20. 15 :(1. {citesc informatia asociata radacinii} rad^. 16 :(1. 9 :(2.4) (3.2) (2.2) (2. end.2) (2.dr := CreareArbore(x-x div 2 -1). A: ArboreBinar.3) (2.4) Arborele nr.3) (3. st. 4 :(2. pentru n=4. end..3) (3. 5 :(3. function CreareArbore(x: Vf): ArboreBinar.1) (1. rad^.4) (3.4) Arborele nr. 10 :(1.1) (1.3) (2.1) (1. 11 :(1. conţinutul fişierului de ieşire va fi: Arborele nr.{aloc memorie pentru radacina arborelui} read(fin. ArboreBinar = ^NodArboreBinar.4) Arborele nr. 6 :(1.3) (3. 2 :(3. {parcurge recursiv in preordine arborele binar cu radacina rad} 48 .4) Arborele nr.NrMaxVf.4) Arborele nr. {creez subarborele drept} CreareArbore:=rad.4) (2.2) (3.3) (3.1) (3. 7 :(1.4) (3.4) Arborele nr.4) Arborele nr.4) Arborele nr.3) (3.4) (2. 3 :(2.4) Arborele nr. NodArboreBinar = record inf: char.4) program Operatii_pe_arbori_binari.2) (2.2) (2.4) Arborele nr.1) (1.

p^.inf^. var S. NodCurent := p^.st. p^.dr. S := p. p^.begin if rad <> nil then begin write(fout. end end. dispose(p). write(fout. procedure parcurgere_pe_niveluri(rad: ArboreBinar). NodCurent := NodCurent^.dr). NodCurent: ArboreBinar. S := S^. urm: Stiva end. 'Parcurgerea inordine: '). p: Stiva. postordine(rad^.inf^. until (S = nil) and (NodCurent = nil). end. procedure inordine_iterativ(rad: ArboreBinar). daca este posibil.inf).urm := S. end.inf). begin write(fout. writeln(fout). repeat while NodCurent <> nil do begin {introduc in stiva nodul curent} new(p). rad^.urm. {parcurge pe niveluri arborele binar cu radacina rad} 49 . {extrag.dr). end.st). {parcurge recursiv in postordine arborele cu radacina rad} begin if rad <> nil then begin postordine(rad^. {parcurge iterativ in inordine arborele binar cu radacina rad} type Stiva = ^NodStiva. NodStiva = record inf: ArboreBinar. un element din stiva si vizitez nodul din arbore corespunzator} if S <> nil then begin p := S. preordine(rad^. write(fout. rad^. procedure postordine(rad: ArboreBinar).st).inf).inf := NodCurent. NodCurent := rad. preordine(rad^. end end. S := nil.

IncC^.urm := nil.dr <> nil then {inserez in coada fiul drept al nodului vizitat} begin new(q). end. q^.dr))+1. b: integer): integer. end.inf^. SfC^. SfC := IncC. if rad <> nil then begin {initializez coada cu radacina arborelui} new(IncC). p.urm.inf^. IncC^. write(fout. NodCoada = record inf: ArboreBinar. 50 . begin write(fout.urm := q. dispose(p) end.inf^.dr. SfC := q end. {intoarce inaltimea arborelui binar cu radacina rad} begin if rad = nil then {arborele este vid} inaltime := -1 else inaltime := max(inaltime(rad^.'opbin.inf^.urm := nil. q^.urm := q. while IncC <> nil do begin p := IncC. inaltime(rad^. var IncC.inf := p^. begin if a > b then max := a else max := b end.inf := rad. {extrag efectiv din coada nodul p} IncC := IncC^. q^. urm: Coada end.st <> nil then {inserez in coada fiul stang al nodului vizitat} begin new(q). SfC. p^. function inaltime(rad: ArboreBinar): integer. reset(fin).inf := p^.in').st).type Coada = ^NodCoada.inf^. SfC^. begin {program principal} assign(fin. function max(a. q: Coada. SfC := q end. {vizitez nodul din arbore corespunzator lui p} if p^. writeln(fout) end. q^. 'Parcurgerea pe niveluri: ').inf). if p^.urm := nil.st.

type Vf = 0.'Parcurgerea preordine: ').IPozRad-1] constituie parcurgerea inordine a subarborelui stang. {determin pozitia radacinii in parcurgerea inordine} IPozRad := st. writeln(fout. cu radacina rad+1} r^. rewrite(fout).. inaltime(A)). 51 . if IPozRad = dr then {subarborele drept este vid} r^.. write(fout. st.dr] constituie parcurgerea inordine a subarborelui drept. program Constructie_Arbore_Binar. r^.st := nil else {i[st. if IPozRad = st then {subarborele stang este vid} r^. function ConstrArb(rad. {functia intoarce un adresa radacinii arborelui binar cu radacina rad. parcurgere_pe_niveluri(A). end. NodArboreBinar = record inf: Vf.n). st. cu radacina rad+IPozRad-st+1. dr: Vf): ArboreBinar. Parcurgere = array[Vf] of Vf.'Parcurgerea postordine: '). IPozRad: Vf.{parcurgerea inordine} n: Vf.. A:=CreareArbore(n).inf := rad.st.dr).out').IPozRad+1. end. inordine_iterativ(A).NrMaxVf. write(fout. close(fout).{numarul de varfuri din arbore} fout: text. preordine(A). while i[IPozRad] <> rad do inc(IPozRad).dr := nil else {i[IPozRad+1. close(fin). writeln(fout). readln(fin.IPozRad-1).dr reprezinta limitele intre care se gaseste parcurgerea inordine a arborelui in vectorul i} var r: ArboreBinar.assign(fout. dr: ArboreBinar.'opbin. var A: ArboreBinar. postordine(A). const NrMaxVf = 20. begin new(r). deoarece in subarborele stang sunt IPozRad-st+1 varfuri} r^. i: Parcurgere. ArboreBinar = ^NodArboreBinar. st.dr := ConstrArb(rad+IPozRad-st+1.st := ConstrArb(rad+1. writeln(fout). 'Inaltimea arborelui este: '.

st <> nil then preordine(rad^. write(fout. 'Arbore vid') else preordine(A). readln(fin. De exemplu. if A = nil then write(fout. {afiseaza reprezentarea cu paranteze a arborelui} writeln(fout). AfisareArb.))).st). rewrite(fout). if rad^. '('). close(fout).dr). rad^. end.9(10(. {parcurge recursiv in preordine arborele binar cu radacina rad} begin write(fout. if rad^. end. procedure AfisareArb. procedure Citire. '. procedure preordine(rad: ArboreBinar). end. i[k]). begin assign(fout.). if n > 0 then A := ConstrArb(1. reset(fin).)).in').'pi. 1.n). end.inf. readln(fin). begin assign(fin. close(fin).). ')').dr <> nil then preordine(rad^.))) {$N+ } 52 . begin {program principal} Citire.5(. fin: text.').ConstrArb := r.6(. var k: Vf.7(8(. n) else A := nil. end.'pi.4(. pentru fişierul de intrare: 10 3 4 5 2 6 1 8 7 10 9 fişierul de ieşire va fi: 1(2(3(. write(fout.out'). for k := 1 to n do read(fin.

NrArb := 1.program Numar_Arbori_Binari_Distincti.NrVf. NrArb: extended. begin write('Introduceti numarul de varfuri '). i: byte.'varfuri: '). var NrVf. writeln(NrArb:50:0). de arbori binari distincti cu '. writeln('Nr. for i := 2 to NrVf do NrArb := NrArb*(NrVf+i)/i. readln end. 53 . readln(NrVf).

54 .

55 .

Sign up to vote on this title
UsefulNot useful