Professional Documents
Culture Documents
struct Nod{
Atom data;
Nod* vDesc[GRMAX];
};
p->vDesc[i]
Intr-un arbore cu un numar N de noduri vor exista N-1 muchii, deci in total N-1 elemente
din vectorii de pointeri la descendenti sint ocupate cu informatie utila. Se obtine raportul:
N −1 1
=
N * GRMAX GRMAX
struct Nod {
Atom data;
Nod* desc;
Nod* next;
};
Laborator de Structuri de Date si Algoritmi – Lucrarea nr. 5
Avind in vedere semnificatia pointerilor continuti intr-un nod aceasta reprezentare se mai
numeste "reprezentarea FIU-FRATE".
In aceasta reprezentare, daca p este un pointer la un nod, identificarea descendentul i
al nodului va necesita parcurgerea listei inlantuite a descendentilor, lista care incepe cu:
p->desc
struct Nod{
Atom data;
int grad;
Nod* vDesc[GRMAX];
};
- Un nod de grad 3:
Laborator de Structuri de Date si Algoritmi – Lucrarea nr. 5
- Un nod de grad 1:
- Un nod terminal:
Pentru a realiza economia de memorie este necesar ca la alocarea spatiului pentru un nod
sa se cunoasca numarul de descendenti si in functie de acest numar sa se aloce spatiul
necesar pentru vectorul de descendenti. Iata cum trebuie scrisa functia make_nod care
aloca spatiu pentru un nod de grad dat:
TEMA 1
Functia
Nod* creareArbore();
Laborator de Structuri de Date si Algoritmi – Lucrarea nr. 5
din AnexaA citeste de la intrare o expresie aritmetica, cu paranteze, care contine operanzi
de o cifra si operatorii + si *, si creaza arborele de grad oarecare asociat expresiei. De
exemplu:
Arborele este reprezentat dupa metoda 3, tipul Atom fiind echivalat cu tipul int (vezi
Anexa A).
Se cere:
■ Sa se determine si sa se afiseze gradul arborelui.
■ Sa se afiseze valoarea tuturor operanzilor utilizati in expresie (fara operatori).
■ Sa se evalueze expresia si sa se afiseze rezultatul.
struct Nod
{
type data;
Nod* stg, *drt;
};
Astfel, arborele:
Pentru a putea prelucra un arbore este suficient sa cunostem un pointer la nodul radacina.
Valoarea nil pentru acest pointer va semnifica un arbore vid.
II.2. Pacurgeri
Un arbore binar poate fi privit conform urmatoarei scheme recursive:
rad = radacina
SAS = SubArbore Sting
SAD = SubArbore Drept
Pentru arborele:
Laborator de Structuri de Date si Algoritmi – Lucrarea nr. 5
PREORDINE: ABDCEF
INORDINE: BDAECF
POSTORDINE: DBEFCA
sau
A doua varianta nu poate fi aplicata unui arbore vid, in timp ce prima trateaza corect
arborele vid, in schimb executa un apel recursiv in plus pentru fiecare legatura care este
NULL.
void CautaMax(Nod* p)
{/* ----------------Parcurgere preordine Varianta 2*/
if (p!=NULL){
if (p->data>max) max=p->data;
Laborator de Structuri de Date si Algoritmi – Lucrarea nr. 5
CautaMax(p->stg);
CautaMax(p->drt);
}
}
char ValMax(Nod* p)
{
max = 0;
CautaMax(rad);
return max;
}
Varianta 2
Pornind de la schema:
Iata implementarea:
vmax = rad->data;
if rad->lchild!=NULL
vmax = max(vmax,ValMax(rad->lchild));
if rad->rchild!=NULL
vmax = max(vmax,ValMax(rad->rchild));
return vmax;
}
Aceasta varianta nu se poate aplica unui arbore vid, dar are avantajul ca se poate aplica si
in cazuri in care nu exista o valoare de eticheta pentru nod mai mica decit toate etichetele
posibile (cum am folosit mai sus, valoarea 0).
TEMA 2
struct Nod {
char data;
struct Nod *stg, *drt;
}
si functia:
Nod* creareArboreB();
2. Sa se scrie un program care citeste expresii formate din operanzi, numere intregi de o
cifra, si operatorii + si *. Creeaza arborele expresiei si calculeaza valoarea expresiei pe
arbore.
Anexa A
Fisierul Arbore.h
#ifndef _ARBORE_H_
#define _ARBORE_H_
struct Nod
{
Atom data;
int grad;
Nod* vDesc[GRMAX];
};
Nod* creareArbore();
#endif
Fisierul Arbore.cpp
#include "arbore.h"
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
Nod* creareArbore()
{
char buffer[DIM_EXPR];
openP = 0;
for (int i = start; i <= end; i++)
{
if ( buffer[i]=='(' )
openP ++;
if ( buffer[i]==')' )
openP --;
if ( buffer[i]=='+' )
{
if ( openP > 0)
continue;
indici[k++] = i;
}
}
if ( k > 0 )
{
Nod *p=(Nod*) new char[sizeof(Nod)-(GRMAX-k+1)*sizeof(Nod*)];
p->grad = k+1;
p->data='+';
p->vDesc[0] = parse(buffer, start, indici[0]-1);
for (int j = 1; j < p->grad - 1; j++)
{
p->vDesc[j] = parse(buffer, indici[j-1]+1, indici[j]-1);
}
p->vDesc[p->grad-1] = parse(buffer, indici[p->grad-2]+1, end);
return p;
}
openP = 0;
for (i = start; i <= end; i++)
{
if ( buffer[i]=='(' )
openP ++;
if ( buffer[i]==')' )
openP --;
if ( buffer[i]=='*' )
{
if ( openP > 0)
continue;
indici[k++] = i;
}
}
if ( k > 0 )
{
Nod *p=(Nod*) new char[sizeof(Nod)-(GRMAX-k+1)*sizeof(Nod*)];
p->grad = k+1;
Laborator de Structuri de Date si Algoritmi – Lucrarea nr. 5
p->data='*';
p->vDesc[0] = parse(buffer, start, indici[0]-1);
for (int j = 1; j < p->grad - 1; j++)
{
p->vDesc[j] = parse(buffer, indici[j-1]+1, indici[j]-1);
}
p->vDesc[p->grad-1] = parse(buffer, indici[p->grad-2]+1, end);
return p;
}
if ( start==end )
if ( isdigit(buffer[start]) )
{
Nod* p = (Nod*) new char[sizeof(Nod)-(GRMAX)*sizeof(Nod*)];
p->data = buffer[start];
p->grad = 0;
return p;
}
ANEXA B
Arbore_binar.h
struct Nod{
char data;
Nod* stg, *drt;
};
void eroare();
char readchar();
char citesteNume();
Nod* citesteArboreB();
Nod* creareArboreB();
Arbore_binar.cpp
#include <alloc.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "arbore_binar.h"
char car;
void eroare()
{
printf("Sirul de intrare este eronat!\n");
printf("Apasati tasta o tasta...");
getch();
exit(1);
}
char readchar()
{
char c;
do c=getchar(); while(c==' ');
return c;
}
char citesteNume()
{
char c;
if(!isalpha(car)) eroare();
c = car;
Laborator de Structuri de Date si Algoritmi – Lucrarea nr. 5
car = readchar();
return c;
}
Nod* citesteArboreB()
{
Nod* rad;
if( car=='-' ) {
rad=0;
car = readchar();
}
else {
rad = (Nod*) malloc(sizeof(Nod));
rad->data = citesteNume();
if( car!='(' ) {
rad->stg = 0;
rad->drt = 0;
}
else {
car = readchar();
rad->stg = citesteArboreB();
if( car!=',' ) rad->drt = 0;
else {
car = readchar();
rad->drt = citesteArboreB();
}
if( car!=')' ) eroare();
car = readchar();
}
}
return rad;
}
Nod* creareArboreB()
{
printf("\nIntroduceti arborele:");
car = readchar();
return citesteArboreB();
}