Sunteți pe pagina 1din 40

MINISTERUL EDUCAIEI,CERCETRII,TINERETULUI I

SPORTULUI
COLEGIUL TEHNIC MTSARI

PROF. COORDONATOR:
SCEANU ION
ELEV:
CIORTAN ALEXANDRA
ANDREEA

CLASA a XII-a B
PROFIL: MatematicInformatic

MINISTERUL EDUCAIEI,CERCETRII,TINERETULUI I
SPORTULUI
COLEGIUL TEHNIC MTSARI

PROF. COORDONATOR:
SCEANU ION
ELEV:
CIORTAN ALEXANDRA
ANDREEA

CLASA a XII-a B
PROFIL: MatematicInformatic

Cuprins
Capitolul I.FORMULAREA TEMEI....................................................................3
1.1.ASPECTE GENERALE LEGATE DE TEMA LUCRRII .
DOMENIUL N CARE SE NCADREAZ LUCRAREA.....................................3
1.2.EXPLICAREA PROBLEMEI PROPUSE SPRE REZOLVARE....................3
1.3.EXPLICAII FINALE LEGATE DE TEMA PROPUS
UTILITATEA TEMEI, ASPECTE REZOLVATE DE ACEASTA, POSIBILITI DE
DEZVOLTARE A TEMEI....................................................................................4

ARBORI......................................................................................................5
OPERATII ELEMENTARE..........................................................................6
ARBORI PARTIALI....................................................................................8
ARBORI BINARI.......................................................................................11
ALGORITMI ELEMENTARI.....................................................................14
ARBORI DE SORTARE............................................................................20
EVALUREA EXPRESIILOR ARITMETICE...............................................28
FORMA POLONEZA A EXPRESIILOR ARITMETICE.............................29
BIBLIOGRAFIE.........................................................................................37

Capitolul I.FORMULAREA TEMEI


1.1.ASPECTE GENERALE LEGATE DE TEMA LUCRRII .
DOMENIUL N CARE SE NCADREAZ LUCRAREA
n momentul de fa prelucrarea informaiilor de orice natur cu
ajutorul computerului este utilizat n toate domeniile. Deoarece costul unui
calculator nu este att de mare i majoritatea colilor au n dotare astfel de
echipamente, nsuirea cunotinelor teoretice din domeniul informaticii se
poate mult mbunti prin utilizarea unor produse soft specializate. Partea
aplicativ constituie o verig foarte important a informaticii i de aceea,
elevii au nevoie de exerciiu.
Lucrarea este util att elevilor interesai de studiul acestei
discipline,ct i profesorilor , la leciile curente ct i n cadrul celor
recapitulative.
1.2.EXPLICAREA PROBLEMEI PROPUSE SPRE REZOLVARE
Problema propus spre rezolvare este de fapt o prezentare complet
a notiunilor teoretice legate de arbori. Fiecare subcapitol cuprinde n afara
prezentrii teoretice ( text i imagini), urmat de o colecie de programe
aplicative si de o analiz a complexittii acestoara. Programele sunt descrise
n detaliu n capitolul al II-lea, fiecare dintre ele avnd numeroase comentarii
care s permit nelegerea uoar a metodei de rezolvare, modificarea
total sau parial a unei aplicaii precum i efectuarea unor operaii dificile.
Rularea pas cu pas a unei astfel de aplicaii i urmrirea rezultatelor pariale
au un rol parctic foarte important pentru nsuirea metodei de rezolvare.
Fiecare problem rezolvat are un format foarte plcut de introducere
a datelor de intrare i de afiare a celor de ieire astfel nct rularea unui
program s fie o plcere pentru utilizator. Aplicaiile sunt realizate astfel
nct s nu introduc date eronate.
Noiunile sunt prezentate gradat, de la cele generale ( arbori vzui ca
i grafuri) pn la cazurile particulare ( arbori binari i de sortare).

Lucrarea se ncheie cu o aplicaie interesant a arborilor turnee


sort- un exemplu de utilizare eficient a arborilor.

1.3.EXPLICAII FINALE LEGATE DE TEMA PROPUS


UTILITATEA TEMEI, ASPECTE REZOLVATE DE ACEASTA, POSIBILITI
DE DEZVOLTARE A TEMEI
Utilizarea

acestei

colecii de programe are

o serie de avantaje

foarte evidente, dintre care enumerm

confirmarea practic a unor rezultate teoretice

insuirea algoritmilor de rezolvare, prin urmrirea pas cu pas a


programelor i vizualizarea rezultatelor pariale

verificarea dobndirii cunotinelor prin lucrul n paralel elevcalculator

sesizarea progreselor fcute de elevi prin rularea repetat a


unei aplicaii i realizarea unei reprezentri a timpului de
rspuns

Posibiliti de dezvoltare a temei exist i cred c cele mai


importante ar fi urmtoarele:

adugarea unei seciuni care s cuprind teste gril cu


itemi rezultai din parcurgerea unui modul (arbori,arbori
binary, arbori de sortare)

realizarea unui parallelism grafuri orientate-arbori

ARBORI
Definiie:Un graf conex i fr circuite se numete
arbore.
Un graf neconex ale crui componente conexe sunt arbori se
numete pdure.
Un arbore pentru care se precizeaz un nod numit rdcin
iar celelalte noduri pot fi repartizate n mulimi disjuncte, astfel
nct n fiecare dintre aceste mulimi exist un nod vecin cu
rdcin iar subgrafurile generate de acestea au aceeai
proprietate
se
numete
arborescen..Dac
ordinea
subgrafurilor are importan atunci arborescena se numete
arbore ordonat.
Grafic nodurile unei arborescene se deseneaz pe
nivele.Rdcina se afl pe nivelul 0, vrfurile vecine pe nivelul 1,
i aa mai departe. Numrul de nivele determin adncimea
arborelui.
Exemple Graful

este un arbore

Dac precizm c nodul 2 este rdcina arborelui atunci


putem reprezenta arborescena:
-nivel 0

-nivel 1

-nivel 2
-nivel 3

fig.1

Dac nodul v se gsete pe nivelul k, atunci toate nodurile


de pe nivelul k+1,vecine cu nodul v se numesc descendenii
nodului v.Spunem n acest caz c nodul v este nod
tat.Descendenii aceluiai nod se numesc frai. Nodurile care
nu au descendeni se numesc frunze.
Pentru arborescena de mai sus avem : -nodul 3 are descendenii
1,5 i 4
-nodul tat al frunzei 6 este 4

OPERATII ELEMENTARE

Pentru a putea realiza prelucrarea unei arborescene trebuie


s gsim o structur care s permit reprezentarea ei.Vom utiliza
structuri dinamice pentru memorarea valorilor din nodurile
arborescenei;
Declaraiile
const max=10;
type point=^nod;
nod=record
cheie,nrfii:byte;
fiu:array[1..max] of point
end;

precizeaz c pentru fiecare nod al arborescenei memorm


informaia (cheie), numrul de fii i avem un vector cu pointeri
spre descendeni.
var rad:point;

desemneaz un pointer spre nodul rdcin.

Construcia
algoritmului:

arborescenei

se

realizeaz

conform

Pentru nodul curent citim numrul de fii, alocm memorie pentru


memorarea informaiilor din fii, citim valorile fiilor i relum
procedeul pentru fiecare dintre fii.Precizm c valoarea din
rdcin se citete n programul principal i se apeleaz
procedura constr cu parametrul rad.
procedure constr(var p:point);
var i:byte;

begin
if p<>nil then
begin write('Nr. de fii ai nodului cu cheia ',p^.cheie,' ');
readln(p^.nrfii);
for i:=1 to p^.nrfii do
begin new(p^.fiu[i]);
write(' Cheia din fiul ',i,' al nodului cu cheia ',p^.cheie,' ');
readln(p^.fiu[i]^.cheie);
end;
for i:=1 to p^.nrfii do constr(p^.fiu[i]);
end
end;
.
...
{programul principal}
new(rad);
write('Cheia din nodul radacina ');readln(rad^.cheie);
constr(rad);
.

Afiarea nodurilor din arborescen se poate face n dou


moduri
n adncime
Afiarea se face recursiv, scriind valoarea din nodul curent i
repetnd procedeul pentru fiecare fiu al acestuia.
procedure afisadanc(p:point);
var i:byte;
begin
if p<>nil then
begin write(p^.cheie,' (');
for i:=1 to p^.nrfii do
afisadanc(p^.fiu[i]);
write(')')
end end;

Pentru
arborescena
din fig.1 obinem irul:
2,3,1,5,4,6

n lime
Se utilizez o coad n care pstrm pointeri la nodurile de pe
nivelul curent
lista=^nodl;
nodl=record
val:point;
urm:lista
end;

-subprogramul care afieaz coada se apeleaz pentru fiecare


nivel; n acelai subprogram calculm numrul de noduri de pe
nivelul curent
function afislista(p:lista):byte;
var k:byte;
begin
k:=0;
while p<>nil do begin
write(p^.val^.cheie,' ');

p:=p^.urm;inc(k);
end;
afislista:=k
end;

Paii algoritmului care realizeaz afiarea n lime sunt:


Pas 1:se introduce pointerul spre nodul radcin n coad
Pas 2:afim nodurile din coad
Pas3:se parcurge coada i se adaug n coada toi descendenii
nodurilor din coad i se terg nodurile afiate(tergerea unui
element se realizeaz dup ce s-au introdus n coad fii acestuia)
Se repet paii 2 i 3 pn cnd obinem coad vid
procedure afislat;
var prim,ultim,q:lista;
n,i,j:byte;
begin
new(prim);prim^.val:=rad;
prim^.urm:=nil;
ultim:=prim;
while prim<>nil do
begin
n:=afislista(prim);writeln;
{se adaug n list fii corespunzatori nodurilor din coada curent i se
terg nodurile afiate}
for i:=1 to n do
begin for j:=1 to prim^.val^.nrfii do
begin new(q);
q^.val:=prim^.val^.fiuj];
q^.urm:=nil;
ultim^.urm:=q;
ultim:=q
end;
q:=prim;prim:=prim^.urm;
dispose(q)
end
end
end;

ARBORI PARTIALI
Definiie:Fie G=(V(G),M(G)) un graf neorientat.Se
numete arbore parial al grafului G, un graf parial care
este arbore.
Din aceast definiie se poate deduce c exist arbori pariali
numai n cazul grafurilor conexe.
Vom considera n continuare graful ponderat.Fiecrei muchii
ij din graf i se asociaz un numr strict pozitiv numit costul
muchiei notat cu cost(ij).Rezult de aici c avem funcia
cost:M(G)->R+

Definim costul unui arbore ca fiind suma costurilor


muchiilor sale
Cost(G) cos t (m)
mM ( G )

Exemplu:Pentru graful

parial

muchiile punctate marcheaz un arbore

Problem:S se construiasc i s se afieze un


arbore parial de cost minim.
Algoritmul lui Kruskal permite determinarea arborelui
parial de cost minim
Pentru aceasta se pleac de la n componente conexe,fiecare
component conex coninnd un singur nod.
Exemplu:pentru graful reprezentat mai jos
1
3

3
1

1
2

avem initial
.1
componenta
componenta
conex nr.1
conex nr.5

.2

componenta
conex nr.2

4
componenta
conex nr.3

5
componenta
conex nr.4

La fiecare pas se selecteaz o muchie de cost minim


care nu a mai fost aleas i care nu formeaz circuite cu cele deja

10

selectate.(o muchie se adaug n arborele parial numai dac


unete 2 noduri din componente conexe diferite).
In programul Kruskal.pas tabloul g conine pe fiecare
coloan capetele unei muchii,costul su i o variabil ce
precizeaz apartenena la arborele de cost minim.
Pentru graful prezentat avem:
Pasul 1:se selecteaz muchia 1-2 ce are costul 1 .
Nodurile 1 si 2 se afl n componente conexe diferite i se unific
componente conexe 1 si 2.
1

componenta
componenta
conex nr.1
conex nr.5

4
componenta

5
componenta

conex nr.3

conex nr.4

Pasul 2: alegem muchia 1-4 ce are costul 1.


Componenta convex n care se gsete nodul 1este diferit de
componenta conex corespunztoare nodului 4 i deci cele dou
componente conexe vor fi reunite.
1
4

.3

componenta
componenta

conex nr.1

.5
componenta

conex nr.3

conex

nr.5

Pasul 3: se alege muchia 2-4.Nu se adaug pentru c nodurile 2


si 4 sunt n aceeai component conex.
Pasul 4: alegem muchia 1-3.Se unific componentele conexe nr.1
i nr. 3;
1
5
4
2

componenta
conex nr.1

componenta
conex nr.3

Pasul 5: selectm muchia 4-5 ce are costul 3;

11

2
5

componenta conex nr.1

Algoritmul se termin atunci cnd ajungem la o singur


component conex(Un arbore este un graf conex far circuite
i conine n-1 muchii).
program Kruskal;
uses crt;
const max=30;
var
a:array[1..4,1..max] of integer;
n,m,i,j,nrcomp,k:integer;
comp_con:array[1..max] of 0..max;
procedure citire;{se introduc elementele grafului}
var i:1..max;
begin
clrscr;write('Ordinul grafului:');readln(n);
write('dimensiunea grafului:');readln(m);
for i:=1 to m do
begin write('muchia ',i,' : ');readln(a[1,i],a[2,i]);
write('costul muchiei ',a[1,i],' ',a[2,i],' : ');
readln(a[3,i]); a[4,k]:=0
end
end;{se ordoneaz muchiile pentru a fi considerate n ordine
cresctoare}
procedure ordonare_dupa_cost;
begin
for i:=1 to m-1 do
for j:=i+1 to m do
if a[3,i]>a[3,j] then begin
k:=a[1,i];a[1,i]:=a[1,j];a[1,j]:=k;
k:=a[2,i];a[2,i]:=a[2,j];a[2,j]:=k;
k:=a[3,i];a[3,i]:=a[1,j];a[3,j]:=k;
end
end;
begin
citire;ordonare_dupa_cost;{afi[m muchiile ordonate}
for k:=1 to 3 do begin
for i:=1 to m do write(a[1,i],' ');writeln;
end;

12

for i:=1 to n do comp_con[i]:=i;{iniializarea}


k:=1;nrcomp:=n; {k=numarul de componente conexe}
while (k<=m) and (nrcomp>1) do
begin{analizeaz muchia k}
if comp_con[a[1,k]]<>comp_con[a[2,k]] then
begin a[4,k]:=1;{dac unete dou vrfuri diferite se adaug n
arbore}
for i:=1 to n do
if comp_con[i]=comp_con[a[2,k]] then
comp_con[i]:=comp_con[a[1,k]];
dec(nrcomp)
end;
inc(k)
end;
if nrcomp>1 then write('Graful nu este conex')
else begin write('Arb. partial de cost minim contine muchiile: ');
for i:=1 to k do if a[4,i]=1 then
write('(',a[1,i],'',a[2,i],')')
end;
readln
end.

ARBORI BINARI
Definiie:Un arbore binar este o muime finit A de
noduri care poate fi
a)mulimea vid
b)un arbore ordonat n care fiecare nod are cel
mult doi descendeni.
Pentru fiecare nod dintr-un arbore binar distingem
fiul stng i fiul drept.Fiul stng este rdcina
subarborelui stng iar fiul drept rdcina subarborelui
drept.Reamintim c un nod care nu are fii se numete
frunz.(sau nod pendant).
Vom indica pentru fiecare nod o ,,informaie util i
legturile spre fii.
Un arbore binar n care fiecare nod nependant are
exact doi fii se numete arbore binar complet.
Exemple:

rdcina arborelui binar

13

un fiu)

Acest arbore nu este complet(nodul 3 are


Subarborele stng al nodului 2
Subarborele drept al nodului 2


frunze
fig.2
Arborele din fig.3 este complet.

fig.3
Un arbore binar n care fiecare nod nependant are
exact doi fii i toate frunzele se gsesc pe acelai nivel se
numete arbore binar plin.
Din aceast definiie rezult c avem 2k-1 noduri dispuse pe
nivelurile 0,1,k-1 i pe fiecare nivel j avem 2j noduri.
Aceast proprietate se demonstreaz foarte simplu prin
inducie.
Pe nivelul 0 avem un singur nod, nodul rdcin.Numrul de
noduri de pe nivelul 0 este egal cu 20.
Presupunem prin inducie c pe fiecare nivel t avem 2 t
noduri,
pentru
tn.Demonstrm
relaia
pentru
nivelul
n+1.Fiecare nod de pe nivelul n are exact doi fii.Rezult de aici c
pe nivelul n+1 avem 2*2n=2n+1 noduri.Rezult de aici
Proprietatea1.Numrul de noduri dintr-un arbore
binar plin de nlime h este egal cu 20+21+22++2h=2h+11.
Exemplu:

14

fig.4

Proprietatea2.Un arbore binar plin cu n frunze


conine 2n-1 noduri i are nlimea log2(n).
Numrul de noduri de pe nivelul k este egal cu 2 k.Fie m
ultimul nivel.Pe acest nivel vom avea 2 m noduri care sunt
frunze.Rezult de aici c n=2 m(numrul de frunze ntr-un arbore
binar plin este o putere a lui 2).m=log 2(n) i reprezint n acelai
timp nlimea arborelui.Conform propritii 1 avem n arbore un
numr total de noduri egal cu 2m+1-1 = 2*2m+1=2n-1.
Un arbore binar echilibrat este un arbore binar n
care, pentru orice nod diferena dintre numrul nodurilor
din subarborele stng i numrul celor din subarborele
drept este de cel mult o unitate.
Exemplu:


fig.5

Observaii:
Orice arbore binar conine pe nivelul k cel mult 2 k
noduri.
Am demonstrat c un arbore binar plin conine pe fiecare nivel
k exact 2k noduri.Din definiia arborelui binar plin rezult c
acesta este numrul maxim de noduri ce pot exista pe un nivel
k(fiecare nod neterminal are exact 2 descendeni, numr care
este maxim)
Dac arborele binar are f(f>0) frunze atunci exist f1 noduri ce au exact doi fii n arbore.
Dac N este numrul total de noduri din arbore atunci numrul
nodurilor cu doi fii(pe care l notm cu n 2) este egal cu N-f-numrul
nodurilor cu un singur fiu(notat n1).Relaia se scrie N=f+n1+n2.(*).

15

Fiecare nod din arbore, cu excepia rdcinii este fiul unui


alt nod.Rezult de aici c avem N-1 fii n arbore.Aceti fii pot fi
unici sau pot avea un frate.Vom nota cu f1 fii unici i cu f 2 fii ce au
un frate.Obinem deci N-1=f1+f2.(**)
~ntre nodurile cu un singur fiu i fiii unici exist o coresponden
biunivoc(fiecare tat corespunde fiului unic), ceea ce revine la
f1=n1.
Fiecare nod cu doi fii intervine de dou ori n suma f 2(cte o dat
pentru fiecare fiu).Avem deci f2=2n2.
Din(**) avem N=1+f1+f2=1+n1+2n2 i (*) N=f+n1+n2.Rezult de
aici 1+n1+2n2=f+n1+n2 ceea ce implic n2=f-1.

ALGORITMI ELEMENTARI

Reprezentarea arborilor binari se poate realiza cu


ajutorul structurilor statice sau cu ajutorul structurilor
dinamice.Pentru fiecare nod trebiue s memorm o cheie(care
specific informaia util ataat nodului)i legturile spre fii.
~n primul caz putem utiliza
a)doi vectori S i D n care ,pentru fiecare vrf i
specificm n S[i] fiul stng iar n D[i] fiul drept.Cheia din nod se
pstraz n alt vector cheie.Lipsa unui fiu este dat de valoarea
0.Se precizeaz n variabila rad nodul rdcin.
Exemplu: pentru arborele din figura 6 n care sunt trecute cheile

avem reprezentarea (rad=2):


fig.6
D
S
Cheie

3
2
2

5
4
4

0
6
3

0
0
5

0
0
1

8
7
6

0
0
7

0
0
10

16

Nod

Nu este necesar s memorm rdcina (este nodul care nu are


tat => nu apare n tabel pe nici o linie)
b)doi vectori tat si fiu, n care pentru fiecare nod i se
precizeaz nodul tat n tata[i] i se pune n fiu [i] valoarea 1
dac i este descendent stng, valoarea 1 dac este
descendent drept i 0 dac i este rdcin.Se pstraz
vectorul cheie cu acceai semnificaie.
Pentru acelai exemplu avem reprezentarea:
Tata
0
1
1
2
2
3
6
Fiu
0
-1 1
-1 1
-1
-1
Cheie
2
4
3
5
1
6
7
1
2
3
4
5
6
7

6
1
10
8

~n reprezentarea cu ajutorul structurilor dinamice, fiecare


nod este de tipul
type arb=^nod;
nod=record
cheie:tip_cheie;
st,dr:arb
end;

unde cheia ataat fiecrui nod poate fi de tipul dorit.~n


reprezentarea grafic pointerii st i dr sunt reprezentai prin
intermediul sgeilor iar cheia se scrie n fiecare nod.
Generarea arborilor binari
Pentru a prelucra un arbore binar trebuie s-l construim.
Procedura de mai jos realizeaz generarea recursiv a
arborelui(valoarea nil a unui nod este indicat de .).~n procedur
am ales cheia de tip char dar se poate alege orice tip i n locul
caracterului . Putem alege o alt constant de tipul cheii care s
indice valoarea nil.
Pentru fiecare nod diferit de nil se citete cheia i se apeleaz
procedura pentru fii.

procedure constr(var p:arb);


var c:char;
begin
readln(c);{dac se introduce . atunci nodul este nil}
if c<>'.' then begin
new(p);p^.cheie:=c;
writeln('Fiul stang al nodului ',c); constr(p^.st);

17

writeln('Fiul drept al nodului ',c);constr(p^.dr)


end
else p:=nil
end;

Un arbore binar poate fi parcurs utiliznd modalitile generale de


parcurgere a unui arbore (n adncime i pe lime) dar exist i
alte trei modaliti de a parcurge un arbore binar .~n toate
cazurile fiul stng este prelucrat naintea celui drept pentru
orice nod din arbore.
a) parcurgerea n preordine-rdcina
naintea subarborelui stng

este

prelucrat

procedure preordine(p:arb);
begin
if p<>nil then begin
write(p^.cheie,' ');
preordine(p^.st);
preordine(p^.dr)
end
end;

Pentru arborele binar din fig.6 obinem irul: 2,4,5,1,3,6,7,10


b) parcurgerea n inordine-rdcina este prelucrat dup
prelucrarea subarborelui stng i nainte de prelucrarea
celui drept.
procedure inordine(p:arb);
begin
if p<>nil then begin
inordine(p^.st);
write(p^.cheie,' ');
inordine(p^.dr)
end
end;

Pentru arborele binar din fig.6 obinem irul: 5,4,1,2,7,6,10,3


c) parcurgerea n postordine-rdcina este prelucrat
dup prelucrarea subarborelui drept
procedure postordine(p:arb);
begin
if p<>nil then begin
postordine(p^.st);
postordine(p^.dr);
write(p^.cheie,' ')
end
end;

18

Extragerea informaiilor statistice

a)determinarea numrului de frunze dintr-un arbore binar


se realizeaz cu ajutorul unei funcii frunza(p:arb) ce calculeaz
recursiv numrul de frunze din subarborele cu radcina p. Aceast
funcie cerceteaz nodul p i dac acesta este frunz(fiul drept i
cel stng cu valoarea nil)atunci ntoarce valoarea 1 iar altfel
numrul de frunze din subarborele cu rdcina p va fi egal cu
suma dintre numrul de frunze din subarborele stng i numrul
de frunze din subarborele drept.~n cazul n care subarborele
curent este vid funcia ntoarce valoarea 0.
function frunza(p:arb):integer;
begin
if p<>nil then
if (p^.st=nil)and (p^.dr=nil)then frunza:=1
else frunza:=frunza(p^.st)+frunza(p^.dr)
else frunza:=0
end;

b)calculul nlimii unui arbore binar


Vom considera c nlimea unui arbore ce conine un singur
nod(numai rdcina) este 0.Pentru a calcula nlimea unui
arbore cu rdcina p folosim urmtoarea definiie
estevid
1, dac\ arborele

`n\ l]ime(p) 0, dac\ p estefrunz\


maxim(`n
\ l]ime(p^.s
t,p^.dr)
1,dac\ p nuestefrunz\

Definiia este corect pentru c fiecare nod tat p este legat


de fiecare fiu printr-o muchie care contribuie cu o unitate la
nlimea arborelui de rdcin p.
p
1+
p^.st
p^.dr

subarb. drept)

max(nlime

subarb.

stng,

nlime

19

function inaltime(p:arb):integer;
var m,n:integer;
begin
if p<>nil then begin
m:=inaltime(p^.st);
n:=inaltime(p^.dr);
if m>n then inaltime:=m+1
else inaltime:=n+1
end
else inaltime:=-1
end;

d) Numrarea arborilor binari


Fie n R+.S se calculeze numrul de arbori binari distinci
cu n noduri.
Vom nota cu A(n) numrul arborilor cu n noduri.
-pentru n=0 avem un singur arbore (vid) iar pentru n=1 tot un
arbore ce conine numai rdcina.Avem deci A(0)=A(1)=1;
-pentru n=2 avem doi arbori(rdcina i fiul stng sau rdcina i
fiul drept)
-pentru n=3 avem A(3)=5 arbori de forma

-pentru un n oarecare vom numerota nodurile din arbore cu


1,2,n.Fiecare nod i din cele n poate fi rdcin.Vom avea n
subarborele stng i-1 noduri i n subarborele drept n-i
noduri.Numrul de arbori ce au rdcina i fixat este egal cu
produsul A(i-1)*A(n-i) pentru c exist A(i-1) arbori ce se pot
forma cu cele i-1 noduri din subarborele stng i fiecruia dintre ei
i se poate asocia unul din
cei A(n-i) arbori ce pot forma
subarborele drept al nodului i.
Relaia fiind adevrat pentru orice i din intervalul [1,n] rezult c

20

f ( x) A(n) X n
n0

dac\ `nmul]im
ambiitermeni
ai rela]ieiderecuren]
\ cuXn ob]inem
n

i 1

i 1

A(n)Xn A(i 1) * A(n i )X n A(n)Xn X [ A(i 1) X i 1 ] * [ A(n i )X n-i ], n 1


Vomfacesum\ dup\ n 1
n

i 1
[
A
(
i

1
)
X
]
*
[A(n i ) X n i ]

i 1

n 1

A(n) X n [ A(i 1) X i 1 ] *[ A(n i)X n-i ] X *


n 1

n 1 i 1

1,dac\ n 0saun 1

A(n)

A(i 1) * A(n i), dac\ n 1


i 1
Pentru a rezolva recurena vom
considera funcia

Ceea ce indic
f(x)-A(0)=X*f 2(X).Notm f(x) =t i rezolvm
ecuia de gradul 2 n t
X t2- t+A(0)=0 cu A(0)=1
=1-4X
1 1 4X
t1, 2
2X
Vom aplica dezvoltarea binomial pentru g(x)=(1-4X)1/2.
1
1
1
g ( x) (4) (1 4 X ) 2
2
1
2

2 1 1
g ( x) (4) * 1 (1 4 X ) 2
2 2
1

n
1 1
1

presupunem
prininduc]ieg ( x) ( n ) (4) n * * 1 * ..... * (n 1) (1 4 X ) 2
2 2
2

[i demonstr
\ m rela]iapentrun 1

1
n

1 1
1

(n1)
( n)
n
2
g(x) ( g ( x) ) (4) * * 1 * ..... * (n 1) (1 4 X )
2 2
2

( n1)
1 1
1

g ( x) ( n1) (4) n1 * * 1 * ..... * n (1 4 X ) 2


2 2
2

ceea ce demonstrea
z \ rela]ia
Pentru aceasta calculm mai nti derivata de ordin n pentru
funcia g(x).
Avem n acest caz

21

1
[1 (1 4 x) ]
2x
1 1
1
( 1)....( (n 1))
1
2
f ( x)
[1 2 2
(4 x) n ]
2x
n!
n0
1 1
1
( 1).......( n 1)
1
2 2
2
f ( x)
( 1) n 1 2 2 n 1 x n

2 x n1
n!
f ( x)

1 1
1
( 1)....( n)
2
A(n) (1) n 2 2 n 1 2 2

(n 1)!
1(1 2)(1 2 2)(1 2 3).....(1 2n)
A(n) (1) n 2 2 n 1

2 n 1 (n 1)!
(2n 1)[ 2(n 1) 1]........( 2 1)
A(n) 2 n

(n 1)!
2 n n!(2n 1)[ 2(n 1) 1].........(2 1)

( n 1)! n!
( 2n)!
1
A(n)

C 2nn
(n 1)!n! n 1
A(n)

A(n)
coeficientul lui Xn din dezvoltare i este egal cu

este

ARBORI DE SORTARE

Definiie:Un arbore binar de cutare (arbore de


sortare)este un un arbore binar n care fiecare nod are
asociat o ,,cheie de cutare i fiecare nod neterminal
are cheia mai mare dect cheia oricrui nod din
subarborele stng asociat nodului i mai mic dect cheia
oricrui nod din subarborele drept.
O parcurgere n inordine a unui arbore binar de cutare
determin ,,vizitarea nodurilor n ordinea cresctoare a cheilor.

22

Exemplu:

parcurgerea n in ordine:3 6 7 8 9 10

Operaii elementare
Construcia arborilor binari de sortare
Se realizeaz prin inserarea repetat a valorilor dorite n arborele
de sortare.Iniial acesta este vid.
Dac arborele n care se insereaz nodul de cheie x este vid
atunci rdcina acestui arbore va fi dat de nodul care se
insereaz.
Pentru un arbore nevid de rdcin p se compar cheia rdcinii
cu cheia nodului x.
Avem urmtoarele situaii:
x<cheia rdcinii p =>inserm valoarea x n subarborele
stng
x>cheia rdcinii p => inserm valoarea x n
subarborele drept
procedure inserare(x:tip_cheie;var p:arb);
begin
if p=nil then begin
new(p);
p^.cheie:=x;
p^.st:=nil;p^.dr:=nil
end
else
if p^.cheie>x then inserare(x,p^.st)
else inserare(x,p^.dr)
end;

Din definiia arborilor binari de cutare rezult c nu putem


avea dou noduri cu aceeai cheie.Exist, ns n practic foarte
multe situaii cnd dou sau mai multe noduri au aceeai cheie i
trebuie s se gseasc n arbore.
Vom face urmtoarea convenie:Dac n arbore se adaug un
nod care are aceeai cheie cu un nod care se insereaz

23

atunci acesta se va afla n subarborele drept al nodului cu


aceeasi cheie prin acelai procedeu..Procedura de inserare
cuprinde i aceast situaie.

Exemplu:Pentru a insera valoarea x=6 n arborele trasat cu


linii continue vom parcurge drumul indicat de liniile punctate.
X<9

x= 6

x<8
x<7

Parcurgerea arborilor se realizeaz cu ajutorul procedurilor


prezentate n cazul general.
Cutarea unui element de cheie x ntr-un arbore de
sortare
Un element din arborele de sortare poate fi gsit parcurgnd cel
mai scurt drum de la rdcin la nodul respectiv, astfel nct s se
cerceteze un singur nod pe fiecare nivel pn cnd se ntlnete
nodul sau pn cnd se ajunge la nil.
Funcia recursiv caut ntoarce valoarea nil dac nodul de
cheie x nu se gsete narbore i un pointer la nodul respectiv n
cazul n care se gsete.
Pentru a gsi valoarea x n subarborele cu rdcina p se compar
cheia rdcinii cu x. Avem urmtoarele situaii:
x=cheia rdcinii p => funcia cauta va ntoarce
pointerul p
x<cheia rdcinii p =>cutm valoarea x n subarborele
stng
x>=cheia rdcinii p => cutm valoarea x n
subarborele drept
function cauta(x:tip_cheie;p:arb):arb;
begin
if (p=nil)or(p^.cheie=x) then cauta:=p

24

else
if p^.cheie>x then cauta:=cauta(x,p^.st)
else cauta:=cauta(x,p^.dr)

end;

Dac avem noduri cu chei egale atunci n procedura


precedent se testeaz cheia i celelalte componente ale
informaiei utile pentru a vedea dac am ajuns la nodul
dorit.Deplasarea se face n acelai mod.
Exemplu: ~n arborele de cutare urmtor fiecare nod
conine informaiile utile cheie i liter.Se caut nodul ce are cheia
c=6 i litera A.Liniile punctate descriu traseul urmat de funcia
caut.
m c>5
u
T
c=6 dar literaA i se continu cutarea
n dreapta
l

c<10
v
c<7

c=6 i litera=A A

Vom analiza n continuare complexitatea algoritmului de


cutare.
Se observ c la fiecare pas cutarea se restrnge la unul dintre
subarborii nodului curent.Rezult de aici c pe drumul de la
rdcin la nodul cutat sau la nil atunci cnd nodul nu se gsete
vom considera cte un singur nod de pe fiecare nivel.~n cel mai
ru caz nodul nu se gsete n arbore i se parcurge cel mai lung
drum din arbore, drum ce are o lungime egal cu nlimea
arborelui+1.
Exemplu :Pentru a cuta valoarea 13 n arborele urmtor se
parcurge drumul cel mai lung din arbore i este trasat punctat :
8
5

16
15

14
12

15

18
17

19

11

25

nil

Numrul de comparaii efectuate este egal cu numrul


nodurilor prin care trecem + o unitate pentru ultimul fiu
care este nil.
Rezult de aici c avem o complexitate timp de O(h) unde h
este nlimea arborelui.Atunci cnd fiecare nod neterminal are
exact un descendent obinem o niruire a nodurilor din arbore i
h=n-1 ceea ce implic O(h)= O(n)ceea ce precizeaz c avem un
algoritm de complexitate O(n)
Exemplu:

nil

Calculm n continuare complexitatea n medie a acestui


algoritm.
Fie arborele ce conine valorile a1,a2,a3,an cu aiai+1 ,i[1,n1].
Vom presupune c probabilitile cu care se caut numerele
a1,a2,..,an sunt egale i c intervalele (-,a1),(a1,a2)(an,+) sunt
egal probabile 1/n (probabilitatea de a cuta un numr situat n
unul din aceste intervale este aceeai).
Numrul de comparaii necesar n cazul unei cutri ncheiate cu
succes este egal cu nivelul pe care se gsete vrful respectiv
+1(rdcina se afl pe nivelul 0).
Notm cu Cn numrul de comparaii efectuate pentru
cutarea cu succes a unei valori n arborele de sortare cu n
noduri.Pentru n=1 avem Cn=1.~n cazul unui arbore cu n>1
noduri,oricare dintre cele n elemente se poate afla n rdcin.Fie
ak acel element.Rezult de aici c n subarborele stng se vor afla
k-1 elemente i n subarborele drept n-k elemente,ceea ce indic:
1, n 1

Cn
1 n
n

(C k 1 C nk )

n k 1

Pentru a gsi un element x ntr-un subarbore trebuie s


comparm mai nti x cu valoarea din rdcin, deci vom avea n-

26

1 comparaii fcute pentru elemente din subarborii rdcinii.C 0=0


prin definiie.
2 n
C n n 1 C k 1
n k 2
n

nC n n(n 1) 2 C k 1 (*)
k 1

Scriem relaia (*) pentru n-1 i o scdem din (*) .


n

(n 1)C n 1 (n 1)( n 2) 2 C k 1
k 1

nC n (n 1)C n 1 n(n 1) (n 1)( n 2) 2C n 1


Obinem n continuare:
nC n (n 1)C n 1 (n 1)( n n 2)
nC n (n 1)C n 1 2(n 1)
Cn
C
C
n 1
4
2
n 1 2
n 1
, n 2
n 1
n
n(n 1)
n
n 1 n
Cn
C
4
2
n 1

n 1
n
n 1 n
C n 1 C n 2 4
2


n
n 1 n n 1 Scriind ultima relaie pentru n=2,3,,n-1,n i
adunnd relaiile obinute avem:
..
C3 C 2 4 2


4
3 4 3
C 2 C1 4 2


3
2 3 2
n
n
n
Cn
1 n 4
2 1
1
4
2
1
4
1

2
2

n 1 2 2 k 1 2 k 2
n 1 2
n 1 2
k 3 k
3 k
n
n
Cn
1
1
2 2 dx 2 ln n
n 1
x
k 1 k
1

Avem deci o complexitate medie de O(ln n)

{tergerea unui nod din arborele de sortare

27

Aceast operaie trebuie s se execute astfel arborele rmas s


fie arbore de sortare.
Operaiile efectuate difer n funcie de tipul nodului care
se terge.~n fiecare caz se elibereaz zona rezervat
nodului care se terge.
Caz1.{tergem o frunz
Dac arborele avea un singur nod atunci rdcina acestuia devine
nil iar altfel fie t pointerul spre nodul tata al nodului care se
terge.Dac frunza care se terge este fiu stng atunci t^.st
devine nil iar altfel t^.dr:=nil.

Arborele obinut este arbore de sortare pentru c s-au pstrat


relaiile existente ntre nodurile rmase.
Caz 2.{tergem un nod care are un singur fiu.Fie acest nod
p.
Dac p este rdcina arborelui atunci pointerul rad devine
egal cu adresa fiului existent iar altfel fie t pointerul spre nodul
tat al nodului care se terge.~n acest caz subarborele cu
rdcina p este nlocuit cu subarborele nevid al nodului p
(dac p este fiu stng i are doar fiul drept al lui t atunci t^.st
devine p^.dr).

28

Arborele obinut este un arbore de sortare .Fie f fiul nodului care


se terge.
~nainte de tergere p i f se gsesc n acelai subarbore a lui t i
dup tergere f rmne n acelai subarbore , deci se pstreaz
relaiile.
(Pentru exemplul nostru: toate nodurile din subarborele stng al
lui f sunt mai mici dect valoarea din f, se gsesc n subarborele
stng al lui t, deci toate valorile din subarborele stng al lui f sunt
mai mici dect valoarea din t. Nodurile din subarborele drept al lui
f erau i rmn mai mici dect valoarea din f i se gsesc la
rndul lor n subarborele stng al lui t,deci sunt mai mici dect
valoarea din t)
Caz3.{tergem un nod care are ambii fii.
~n acest caz se nlocuiete valoarea din nodul care
se terge cu valoarea din cel mai din stnga nod al
subarborelui drept sau cu valoarea din cel mai din dreapta
nod din subarborele stng i apoi se terge acel nod (care
se gsete n unul din primele dou cazuri).
Exemplu:Se
terge
rdcina

=>

=>

Se alege un astfel de nod pentru ca arborele s rmn


arbore de sortare.
Vom arta acest lucru n cazul n care se nlocuiete
valoarea din nodul care se terge cu valoarea din cel mai
din dreapta nod al subarborelui stng.(pentru situaia a doua
demonstraia se face analog).
Valoarea din nodul care se terge este mai mare dect toate
valorile din subarborele stng.Cea mai mare valoarea din acest
subarbore se gsete n cel mai din dreapta nod al

29

subarborelui stng (pentru orice arbore de sortare valorile din


subarborele drept sunt mai mari dect valoarea din rdcin i
relaia de ordine este tranzitiv Prin nlocuirea valorii din nodul
care se terge cu cea mai mare valoare din subarborele stng i
tergerea acestui nod obinem un nou subarbore stng care n
care toate elementele sunt mai mici dect valoarea din
rdcin.Elementele din subarborele drept nu se modific i sunt
mai mari dect noua valoare din rdcin ntruct aceasta se
gsea iniial n subarborele drept.
uses crt;
type arb=^nod;
nod=record
cheie:byte;
car:char;
st,dr:arb
end;
var rad:arb;
r,n,c:byte;
car:char;
procedure inserare(c:byte;car:char;var p:arb);
begin
if p=nil then begin new(p);
p^.cheie:=c;
p^.car:=car;
p^.dr:=nil;p^.st:=nil
end
else if c<p^.cheie then inserare(c,car,p^.st)
else inserare(c,car,p^.dr)
end;
procedure inordine(p:arb);
begin
if p<>nil then begin inordine(p^.st);
writeln(p^.cheie:5,p^.car:2);
inordine(p^.dr)
end;
end;
function cauta(c:byte;car:char;p:arb):arb;
begin
if (p=nil)or((p^.cheie=c)and(p^.car=car)) then cauta:=p
else
if p^.cheie>c then cauta:=cauta(c,car,p^.st)
else cauta:=cauta(c,car,p^.dr)
end;
procedure sterge(c:byte;car:char;var p:arb);
var q,t:arb;
begin
if p=nil then write('nodul nu se gaseste in arbore')

30

else if (p^.cheie=c)and(p^.car=car) then{se sterge nodul}


begin q:=p;
if p^.dr=nil then
{ nodul care se sterge nu are fiul drept sau nu are ambii fii}
p:=p^.st
else if p^.st=nil then
{ nodul care se sterge are numai fiul drept}
p:=p^.dr
else begin {nodul are ambii fii}
{cauta cel mai
write('cheia nodului ');readln(c);
write('caracterul corespunzator :');readln(car);
end;
case r of
1:inserare(c,car,rad);
2:begin inordine(rad);readln end;
3:begin
if cauta(c,car,rad)=nil then
write('Nodul nu se gaseste in arbore')
else write('Nodul se gaseste in arbore');
readln
end;
4:sterge(c,car,rad);
else
r:=5
end
until r=5
end.

EVALUREA EXPRESIILOR ARITMETICE


Problem: Se introduce de la tastatur un ir de caractere
ce reprezint o expresie aritmetica.S se verifice dac expresia
este corect i in caz afirmativ s se evalueze.Expresia conine
operatorii -,+(unari si binari),*,/ i paranteze rotunde.

FORMA POLONEZA A EXPRESIILOR ARITMETICE


O aplicaie important a arborilor binari o constituie forma polonez a
expresiilor aritmetice.
Definiie.Numim expresie aritmetic o construcie definit prin
urmtoarele diagrame de sintax:
+
expresie aritmetic

31

termen
-

+
-

termen

factor
*
/

constanta
Factor
(

expresie

constant
cifra

cifra

Oricrei expresii E i se poate asocia un arbore binar , construit


dup urmtoarele reguli:
unei expresii format dintr-un singur operand i asociem un
arbore binar format doar din nodul rdcin ce conine
operandul respectiv
dac expresia E este de forma - E1 atunci arborele binar asociat
este de forma:

E1
dac expresia este de forma E=+E1 atunci arborele ataat
expresiei E coincide cu cel al expresiei E1
dac expresia este de forma E=E 1 op E2 ,unde op este un
operator binar din lista prezentat anterior atunci arborele
asociat expresiei este
op

32

E1
E2
dac E=(E1), unde E1 este o expresie aritmetic atunci arborele
binar asociat expresiei aritmetice E coincide cu arborele binar
asociat expresiei E1.

Exemplu:arborele asociat expresiei E= 55+78*(+31-23+34/2+3)6 este de forma


+

*
55 78

*
23

31

34

fig.1

Parcurgnd n postordine arborele binar asociat expresiei


aritmetice,obinem forma polonez postfixat a expresiei
aritmetice.
Notaia a fost introdus de matematicianul polonez
J.Lukasiewicz..Se observ c se obine o expresie fr paranteze .
Fie E o expresie aritmetic.Prin definiie avem:
1)Dac expresia aritmetic E este format dintr-un operand
atunci forma polonez este egal cu E.
2)Dac E1 este o expresie aritmetic atunci forma polonez
asociat expresiei -E1 este forma polonez asociat expresiei
E1urmat de operatorul unar -;dac E=+E1 atunci forma polonez
asociat expresiei E1 coincide cu forma polonez asociat
expresiei E1
3) Dac E1 i E2 sunt expresii aritmetice i op este un
operator binar, atunci forma polonez asociat expresiei E=E1+E2
este forma polonez(E1)forma polonez( E2)op
4)Forma polonez asociat expresiei (E) coincide cu forma
polonez asociat expresiei E.

33

Pentru arborele binar din fig.1 obinem prin parcurgere n


postordine irul:
55 _78 31 23 34 2 / 3 *+ * + 6 - .
Acelai ir se obine prin transformri succesive ale expresiei
E= 55+78*(+31-23+34/2*3)-6 aplicnd regulile date de definiia
formei poloneze:
Vom nota cu fp(E) forma polonez asociat unei expresii
aritmetice.Rezult de aici
fp(55+78*(+31-23+34/2*3)-6)=fp(55+78*(+31-23+34/2*3))6-=
fp(55)fp(78*(+31-23+34/2*3))+6-=fp(55)_fp(78)fp(+3123+34/2*3)*+6- =
55_78

fp(+31-23)

fp(34/2*33)+*+6-

=55_78fp(+31)fp(23)-

fp(34/2)fp(3)*+*+6-=
55_78 31 23 -fp(34)fp(2)/3*+*+6- =55_78

31

23

34

3*+*+6-.
Teorem.Parcurgerea n postordine a unui arbore
binar asociat unei expresii aritmetice E construiete forma
polonez postfixat a expresiei E.
Demonstraie.~ntre regulile de constucie a arborelui
binar i definiia formei poloneze exist o coresponden
biunivoc.
Orice expresie aritmetic are una din formele indicate n
definiia
formei
poloneze(E=constanta,E=E1,E=E1
op
E2,E=(E1).Fiecreia dintre aceste forme i corespunde n mod unic
un arbore binar i o form polonez.Parcurgerea arborelui binar
asociat expresiei E n postordine, n cele 4 cazuri , d forma
polonez corespunztoare expresiei E.(E 1-,E1E2op,E1) .Rezult de
aici c parcurgerea arborelui binar asociat expresiei E n
postordine, d forma polonez corespunztoare expresiei E.
Expresia aritmetic se introduce de la tastatur sub forma unui ir
de caractere.
Pentru a construi arborele binar ataat expresiei aritmetice
vom pstra n cmpul v al oricrui nod operatorul curent (atunci
cnd ne aflm pe un caracter diferit de operator punem simbolul

34

$).Cmpul numr este utilizat pentru pstrarea numrului


curent.Pentru ca expresia s fie corect trebuie s avem n irul
introdus numai cifre i caracterele -,+,*,/,),(,.. Dac
aceast prim condiie nu este ndeplinit atunci expresia nu este
corect.Pentru determinarea corect a valorii expresiei trebuie s
eliminm spaiile din irul introdus(se vor considera pe rnd
caracterele din ir i ele trebuie s indice un operator sau un
operand, deci trebuie s fie diferite de caracterul ).
Se parcurge irul ncepnd cu primul caracter.Arborele binar
corespunztor expresiei va avea rdcin rad.
Procedura
expresie(var
p:arb)construiete
recursiv
arborele de rdcin p ataat expresiei.
Dac primul caracter al expresiei este
-unar atunci
cmpului v din nodul rdcin indicat de p i se atribuie simbolul
_(pentru a face diferen ntre unar i binar) , fiul stng al lui
p are valoarea nil i se construiete(conform diagramei de
sintax) arborele corespunztor termenului care urmeaz dup
operatorul unar -. Rdcina acestui subarbore se atribuie fiului
drept al lui p.
Atunci cnd primul caracter al expresiei este + ,se ignor
acest caracter i se atribuie variabilei p rdcina arborelui ataat
expresiei care ncepe dup operatorul+.
Dac expresia nu ncepe cu un operator unar atunci trebuie
s nceap cu un termen.Pentru a construi arborele de rdcin p
executm paii urmtori:
pas1)construim n p arborele asociat termenului care ncepe la
poziia curent;
pas2)ct timp urmeaz unul dintre operatorii + i - pstrm
acest operator n q^.v,punem n fiul stng al lui q arborele p i n
dreapta construim arborele ataat termenului urmtor.Dup acest
pas rdcina noului arbore se atribuie lui p.
Exemplu:arborele corespunztor expresiei 45+56-3 se
construiete astfel:
Primul caracter al expresiei nu este operator unar,expresia
este corect,deci va ncepe cu o cifr.Vom nota cu i poziia
curent n ir.Iniial i=1.
pas1.Construim n p arborele dat de primul termen.Vom
obine:
45
p

35

pas2.i=3.operatorul de pe poziia a doua este +, deci vom


avea un nou arbore n care rdcina q este +,n stnga se
gsete arborele de rdcin p,n dreapta se construiete arborele
asociat urmtorului termen .Dup acest pas avem p=q.Obinem
arborele:
+
p
45

56

i i=6 ceea ce indic operatorul -.Repetm secvena de mai


sus(q^.st:=p; q^.v=- i n dreapta construim arborele ataat
termenului urmtor.Obinem
p
+
45

3
56

Celelalte proceduri construiesc (pe baza definiiilor i a


diagramelor de sintax) n mod asemntor arborii asociai i
dac se ntlete eroare atunci irul introdus nu este o expresie
corect.
Pentru a calcula valoarea expresiei dup ce am construit
arborele se consider valoarea din rdcin.Dac ea reprezint un
numr atunci acel numr este valoarea expresiei iar altfel se
determin valorile corespunztoare fiilor i se realizeaz cu
acestea operaia indicat de operatorul din rdcin.
uses crt;
type inter=0..3;
arb=^nod;
nod=record
v:char;nr:real;
st,dr:arb
end;
const m=['0'..'9','+','-','*','/','(',')','.'];
numar=['0'..'9','.'];
var exp:string;
rad:arb;c:char;i:byte;
x:pointer;

36

procedure postordine(p:arb);
begin
if p<>nil then begin
postordine(p^.st);postordine(p^.dr);
if p^.v='$' then write(p^.nr:5:2,' ')
else write(p^.v)
end
end;
procedure eroare;
begin
write('Expresie eronata');readln;
halt(0)
end;
procedure citire;
var j:byte;
begin
clrscr;write('Expresia:');readln(exp);
{se elimina spatiile din sir}
j:=0;
while j<length(exp) do
begin inc(j);
if not(exp[j] in m)then eroare;
if exp[j]=' ' then
begin delete(exp,j,1);dec(j)
end
end;
exp:='('+exp+')';writeln(exp);
end;
procedure expresie(var p:arb);forward;
procedure termen(var p:arb);forward;
procedure factor(var p:arb);
{se costruieste nodul teminal p sau subarborele cu radacina p
asociat unei expresii cuprinsa intre paranteze}
var er:integer;
y:string;
begin
if c='(' then
begin inc(i);c:=exp[i];
expresie(p) {c are aici valoarea ')'}
end
else begin
new(p); p^.v:='$';
dec(i);
val(y,p^.nr,er);if er<>0 then eroare
end;
inc(i);c:=exp[i]
end;
procedure termen;
var q:arb;
begin
factor(p);
while c in ['*','/'] do
begin
new(q);q^.v:=c;q^.st:=p;
{se mai citeste un caracter pentru ca operandul 2
incepe dupa c care indica un operator}

37

inc(i);c:=exp[i];
{creeaza si leaga in dreapta nodului q subarborele asociat
operandului 2 al oeratorului c}
factor(q^.dr);
p:=q
end
end;
procedure expresie;
var q:arb;
begin
if c in ['+','-'] then
{- sau + unar}
if c='-' then begin new(p);
p^.v:='_';p^.st:=nil;
inc(i);c:=exp[i];
termen(p^.dr)
end
else begin inc(i);c:=exp[i];
termen(p)
end
else termen(p);
while c in ['+','-'] do begin new(q);
q^.v:=c;q^.st:=p;
inc(i);c:=exp[i];
termen(q^.dr);
p:=q
end
end;
function evaluare(p:arb):real;
var a,b:real;
begin
if p<>nil then begin
a:=evaluare(p^.st);
b:=evaluare(p^.dr);
case p^.v of
'+':evaluare:=a+b;
'-':evaluare:=a-b;
'*':evaluare:=a*b;
'/':evaluare:=a/b;
'$':evaluare:=p^.nr;
'_':evaluare:=-b
end
end
else
evaluare:=0
end;
begin
citire;
readln
end.

38

Cuprins
Capitolul I.FORMULAREA TEMEI....................................................................3
1.1.ASPECTE GENERALE LEGATE DE TEMA LUCRRII .
DOMENIUL N CARE SE NCADREAZ LUCRAREA.....................................3
1.2.EXPLICAREA PROBLEMEI PROPUSE SPRE REZOLVARE....................3
1.3.EXPLICAII FINALE LEGATE DE TEMA PROPUS
UTILITATEA TEMEI, ASPECTE REZOLVATE DE ACEASTA, POSIBILITI DE
DEZVOLTARE A TEMEI....................................................................................4

ARBORI......................................................................................................5
OPERATII ELEMENTARE..........................................................................6
ARBORI PARTIALI....................................................................................8
ARBORI BINARI.......................................................................................11
ALGORITMI ELEMENTARI.....................................................................14
ARBORI DE SORTARE............................................................................20
EVALUREA EXPRESIILOR ARITMETICE...............................................28
FORMA POLONEZA A EXPRESIILOR ARITMETICE.............................29
BIBLIOGRAFIE.........................................................................................37

39

Bibliografie
1.Tudor Sorin-Tehnici
de programare
2.Cristian Udrea-Pascal Teorie si Aplicatii

40

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