Professional Documents
Culture Documents
Coni Emilia-Felicia
Reprezentarea Fiu-Frate
(N, R, Fiu, Frate, Inf)
Cu structuri dinamice
Structur nod: informaie,
adres fiu stng / drept
n lime
Pe niveluri
Pe niveluri
n adncime
Preordine
Preordine
Postordine
Postordine
Inordine
void preordine(TNOD* r)
{ if(r!=NULL)
{ //prelucrare r->info
preordine(r->st);
preordine(r->dr);
}
}
void postordine(TNOD* r)
{ if(r!=NULL)
{ postordine(r->st);
postordine(r->dr);
//prelucrare r->info
}
}
void inordine(TNOD* r)
{ if(r!=NULL)
{ inordine(r->st);
//prelucrare r->info
inordine(r->dr);
}
}
void niveluri(TNOD* r)
{ TNODC* c;
TNOD* p;
int er;
if(r != NULL)
{ c = NULL;
c = push(c,r);
while(c != NULL)
{ c=pop(c,&p,&er);
// prelucrare p>info
if(p->st!=NULL) c
= push(c,p->st);
if(p->dr!=NULL) c
= push(c,p->dr);
}
}
}
int inaltime(TNOD* r)
{ int i,j,k;
if(r == NULL) i = 0;
else
{ j = inaltime(r->st);
k = inaltime(r->dr);
i = 1 + (j>k ? j : k);
}
return(i);
}
10
6
13
4
2
1
8
5
12
9
11
15
14
16
Operaii
Parcurgeri (pe niveluri, preordine, inordine, postordine)
Adugare informaie
tergere informaie
13
4
2
1
8
5
12
9
11
15
12,5
14
16
10
6
13
4
2
8
5
12
15
11
14
16
7,2
7,1
7,3
10
5
12
4
2
7,2
3
11
7,1
9
7,3
15
14
16
#include<iostream>
using namespace std;
struct nod
{int nr_o;
nod*st,*dr;
};
nod *v;
int n,k;
void inserare(nod *&c,int k)
{if(c)
if(c->nr_o==k)
cout<<"nr deja inserat "<<endl;
else
if(c->nr_o<k)
inserare(c->dr,k);
else
inserare(c->st,k);
else
{c=new nod;
c->nr_o=k;
c->st=c->dr=0;}
}
void svd(nod *c) //parcurgere in inordine
{if(c)
{svd(c->st);
cout<<c->nr_o<<" ";
svd(c->dr);
}
}
Arbori de structur
Exemplu: a*(b+c) (d+e)/(f+g)
-
Construire arbore:
1. Calculare prioriti pentru operanzi i operatori
2. Construire propriu-zis a arborelui
Arbori de structur
Exemplu: a*(b+c) (d+e)/(f+g)
1. Calculare prioriti pentru operanzi i operatori
Elemente expr. =(
Prioriti
a,
*,
b,
+,
c,
-,
d,
+,
e,
/,
f,
+,
g)
=(maxint,10,maxint,11,maxint,1,maxint,11,maxint,10,maxint,11,maxint)
Arbori de structur
Exemplu: a*(b+c) (d+e)/(f+g)
Elemente expr. =(
Prioriti
a,
*,
b,
+,
c,
-,
d,
+,
e,
/,
f,
+,
g)
=(maxint,10,maxint,11,maxint,1,maxint,11,maxint,10,maxint,11,maxint)
dac expresia curent este vid, subarborele curent este vid (nil)
2.
3.
4.
fiul stng este subarborele obinut prin reprezentarea subexpresiei din stnga
elementului curent
5.
fiul drept este subarborele obinut prin reprezentarea subexpresiei din dreapta
elementului curent
Arbori de structur
Exemplu: a*(b+c) (d+e)/(f+g)
Elemente expr. =(
Prioriti
a,
*,
b,
+,
c,
-,
d,
+,
e,
/,
f,
+,
g)
=(maxint,10,maxint,11,maxint,1,maxint,11,maxint,10,maxint,11,maxint)
a*(b+c)
a
a
*
b
+
c
(maxint, 10, maxint, 11, maxint)
(d+e)/(f+g)
(d+e)/(f+g)
a
(maxint)
b+c
Arbori de structur
Exemplu: a*(b+c) (d+e)/(f+g)
Elemente expr. =(
Prioriti
a,
*,
b,
+,
c,
-,
d,
+,
e,
*
()
()
()
+,
g)
(d+e)/(f+g)
b+c
()
f,
=(maxint,10,maxint,11,maxint,1,maxint,11,maxint,10,maxint,11,maxint)
/,
b
+
c
(maxint, 11, maxint)
(d+e)/(f+g)
+
Arbori de structur
Exemplu: a*(b+c) (d+e)/(f+g)
Elemente expr. =(
Prioriti
a,
*,
b,
+,
c,
-,
d,
+,
e,
+,
g)
(d+e)/(f+g)
+
f,
=(maxint,10,maxint,11,maxint,1,maxint,11,maxint,10,maxint,11,maxint)
/,
a
c
d
+
e
/
f +
g
(maxint,11,maxint,10,maxint,11,maxint)
/
+
d+e
c
f+g
Arbori de structur
Parcurgerea arborelui n preordine => forma polonez direct a
expresiei:
-*a+bc/+de+fg
a*b+cd+e/f+g
((a)*((b)+(c)))-(((d)+(e))/((f)+(g)))
Arbori de structur
Evaluare expresie: prin parcurgere n postordine.
Prelucrarea fiecrui nod r const n
dac e nod frunz nu se schimb nimic
altfel se nlocuiete informaia r->inf cu rezultatul expresiei
ss r->inf sd
unde ss i sd snt informaiile din fiul stng respectiv drept al
nodului curent
a = 3, b = 4, c = 6, d = 10, e = 5, f = 2, g = 1
25
-
Arbori de
structur
5/
30
*
3
+
10
4
+
15
6
10
+
3
5
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
#define MAXINT 10000
/* reprezentarea unei expresii prin arbore de structura si
evaluarea ei
restrictii:
- numai operatori aritmetici + - * /
- identificatorii operanzilor formati din numai o litera
- fara spatii
*/
typedef struct nod{ char inf;
float v;
struct nod *s,*d;
} TNOD;
//eliminare paranteze
r=(char*)malloc(strlen(s));
strcpy(r,s);
i=0;
while(i<l)
if( (r[i]==')') || (r[i]=='(') )
{ for(j=i+1; j<l; j++)
r[j-1]=r[j];
r[l]='\0';
l--;
}
else i++;
*n=crt;
return r;
}
evaluare(rad->s) + evaluare(rad->d);
evaluare(rad->s) - evaluare(rad->d);
evaluare(rad->s) * evaluare(rad->d);
evaluare(rad->s) / evaluare(rad->d);
void main()
{ char expresie[100], *efp, *fpd;
int p[100],n;
TNOD* radacina_arbore_structura;
printf("\nExpresia de analizat (corecta, conform restrictiilor):\n");
gets(expresie);
radacina_arbore_structura=NULL;
//calcul prioritati
efp=prioritati(expresie,p,&n);
//construire arbore
radacina_arbore_structura=construire_arbore(0,n-1,efp,p);
//determinarea formei poloneze a expresiei
fpd=(char*)malloc(strlen(efp));
fpd[0]='\0';
forma_poloneza(radacina_arbore_structura,fpd);
printf("\nForma poloneza directa: %s",fpd);
//evaluare expresie
printf("\nValorile operanzilor:\n");
citire_valori_operanzi(radacina_arbore_structura);
evaluare(radacina_arbore_structura);
printf("\nValoare expresiei este: %7.3f\n",radacina_arbore_structura>v);
}
Atenie:
Dac mai multe elemente au
aceeai prioritate minim, se
alege ultimul pentru a fi rdcin
Exemplu:
a-b*c+d
a=100, b=2, c=5, d=10
Probleme de rezolvat
Eliminarea spaiilor
Utilizarea altor operatori
Utilizarea de identificatori mai
lungi