Sunteți pe pagina 1din 6

Lucrarea de laborator nr. 4.

ARBORI
1. Coninutul lucrrii
n lucrare sunt prezentate operaiile de baz asupra arborilor binari, binari total echilibrai i
arborilor oarecare.
2. Consideraii teoretice
Arborele binar, foarte des ntlnit n aplicaii, este arborele n care orice nod are cel mult doi
descendeni: fiul stng i fiul drept.
2.1. Construirea, traversarea i tergerea unui arbore binar.
Construirea unui arbore binar se face citind n preordine din fiierul de intrare informaiile din
nodurile arborelui. Subarborii vizi trebuie s fie notai cu un semn distinctiv. De exemplu pentru arborele
din figura 2.1.1, notnd identificatorul pentru arborele vid cu * , introducerea identificatorilor nodurilor
se va face astfel:

ABD*G***CE**F*H**

Fig. 2.1.1. Arbore binar.

Tipul unui nod se declar astfel:


typedef struct tip_nod {
char ch; /* identificatorul nodului */
informaie;
struct tip_nod *stg, *dr;
} TIP_NOD;
Construirea unui arbore binar se face conform funciei de construire, avnd urmtoarea structur:
TIP_NOD *construire( )
{
TIP_NOD *p;
int n;
char c;

n=sizeof(TIP_NOD);
/* citire caracter de identificare nod */
scanf(%c, c);
if(c==*) return 0;
else {
/* construire nod de adres p */
p=(TIP_NOD *)malloc(n);
/* introducere de informaie n nod */
p->ch=c;
p->stg=construire( );
p->dr=construire( );
}
return p;
}
Apelul funciei se va face astfel:
rdcina = construire ( )
Traversarea unui arbore binar se poate face n cele 3 moduri cunoscute: preordine, inordine,
postordine.
n programul urmtor sunt implementate operaiile de construcie i traversare a unui arbore binar.
Nodul conine numai identificatorul su. Afiarea nodurilor vizitate se face cu indentare.
/* Program de construire i afiare a arborilor binari */
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
typedef struct tip_nod{
int nr.; /*informaie */
struct tip_nod *stg,*dr;
} TIP_NOD;
TIP_NOD *rad;
void preordine(TIP_NOD *p, int nivel)
{
int i;
if (p!=0){
for(i=0;i<=nivel;i++) printf(" ");
printf("%2d\n",p->nr);
preordine(p->stg,nivel+1);
preordine(p->dr,nivel+1);
}
}
void inordine(TIP_NOD *p, int nivel)
{
int i;
if (p!=0){
inordine(p->stg,nivel+1);
for(i=0;i<=nivel;i++) printf(" ");
printf("%2d\n",p->nr);
inordine(p->dr,nivel+1);
}
}
void postordine(TIP_NOD *p, int nivel)
{

int i;
if (p!=0){
postordine(p->stg,nivel+1);
postordine(p->dr,nivel+1);
for(i=0;i<=nivel;i++) printf(" ");
printf("%2d\n",p->nr);
}
}
TIP_NOD *constructie()
{
TIP_NOD *p;
int inf,n;
n=sizeof(TIP_NOD);
printf("\nIntroduceti Inf.din nod inf=");
scanf("%d",&inf);
if(inf==0) return 0;
else {
p=(TIP_NOD *)malloc(n);
p->nr=inf;
p->stg=constructie();
p->dr=constructie();
}
return p;
}
void main(void)
{
rad=constructie();
printf("\nVIZITAREA IN PREORDINE\n");
preordine(rad,0);
getch();
printf("\nVIZITAREA IN INORDINE\n");
inordine(rad,0);
getch();
printf("VIZITAREA IN POSTORDINE\n");
postordine(rad,0);
getch();
}
2.1 Arbori binari total echilibrai
Un arbore binar total echilibrat este un arbore binar care ndeplinete urmtoarea condiie: numrul
nodurilor unui oricare subarbore stng difer cu cel mult 1 n plus fa de numrul nodurilor subarborelui
corespunztor drept. Rezult c frunzele sale se afl pe ultimele dou niveluri.
Algoritmul de construire a unui arbore binar total echilibrat cu n noduri, este urmtorul:
a) un nod este rdcin;
b) se iau nstg = [n/2] noduri pentru arborele stng i se trece la construirea lui (pasul a);
c) se iau cele ndr=n-nstg-1 noduri rmase pentru subarborele drept i se trece la construirea lui
(pasul a).
Pentru oricare nod exist relaia:
ndr <= nstg <= ndr + 1
n programul urmtor este implementat acest algoritm pentru construirea unui arbore binar total
echilibrat, citirea informaiei n noduri fcndu-se n preordine.

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
/* ARBORI BINARI TOTAL ECHILIBRATI */
typedef struct tip_nod{
int nr;/*informaie */
struct tip_nod *stg,*dr;
} TIP_NOD;
TIP_NOD *rad;
void preordine(TIP_NOD *p, int nivel)
{
int i;
if(p!=0) {
for(i=0;i<=nivel;i++) printf(" ");
printf("%2d\n",p->nr);
preordine(p->stg,nivel+1);
preordine(p->dr,nivel+1);
}
}
void inordine(TIP_NOD *p, int nivel)
{
int i;
if (p!=0){
inordine(p->stg,nivel+1);
for(i=0;i<=nivel;i++) printf(" ");
printf("%2d\n",p->nr);
inordine(p->dr,nivel+1);
}
}
void postordine(TIP_NOD *p, int nivel)
{
int i;
if (p!=0){
postordine(p->stg,nivel+1);
postordine(p->dr,nivel+1);
for(i=0;i<=nivel;i++) printf(" ");
printf("%2d\n",p->nr);
}
}
TIP_NOD *constructie(int nr_noduri)
{
TIP_NOD *p;
int n_stg,n_dr;
int inf,n;
n=sizeof(TIP_NOD);
if(nr_noduri==0) return 0;
else {
n_stg=nr_noduri/2;
/*nr_noduri din subarborele stang */
n_dr=nr_noduri-n_stg-1;

/*nr.noduri din subarborele drept */


p=(TIP_NOD *)malloc(n);
printf("\nIntroduceti informatia din nod in preordine ");
scanf("%d",&(p->nr));
p->stg=constructie(n_stg);
p->dr=constructie(n_dr);
}
return p;
}
void main(void)
{
int nr_total_noduri;
printf("\nNumarul total de noduri =");
scanf("%d",&nr_total_noduri);\
rad=constructie(nr_total_noduri);
printf("\nVIZITAREA IN PREORDINE\n");
preordine(rad,0);
getch();
printf("\nVIZITAREA IN INORDINE\n");
inordine(rad,0);
getch();
printf("VIZITAREA IN POSTORDINE\n");
postordine(rad,0);
getch();
}
2.2 Arbori oarecare
Arborele oarecare este un arbore a crui noduri au mai mult de doi descendeni.
Un nod are urmtoarea structur:
typedef struct tip_nod {
informaie;
int nr_fii; /*numr de fii */
struct tip_nod *adr_fii [maxfii];
/* adresele nodurilor fiu */
} TIP_NOD;
Construirea arborelui se realizeaz astfel:
pentru fiecare nod se citete informaia util i numrul de fii;
nodurile citite n postordine i adresele sunt pstrate ntr-o stiv pn cnd apare nodul al crui fii
sunt. n acest moment adresele fiilor sunt scoase din stiv, iar adresele lor sunt trecute n nodul tat, dup
care adresa nodului tat este pus n stiv. n final singura adres n stiv va fi cea a rdcinii, arborele
fiind construit.
Traversarea arborelui pe orizontal (nivel dup nivel) se va face astfel:
se utilizeaz o coad pentru pstrarea adreselor nodurilor ce urmeaz s fie prelucrate;
iniial coada este vid;
se introduce n coada adresa rdcinii;
se scoate pe rnd din coad adresa a cte unui nod, se prelucreaz informaia din nod, iar apoi se
introduc adresele fiilor nodului respectiv. Se repet acest pas pn cnd coada devine vid.

3. Mersul lucrrii
3.1 Se citete de la tastatur o expresie matematic n form postfixat, sub forma unui ir de caractere.
S se construiasc arborele corespunztor acestei expresii, fiecare nod coninnd un operator sau un
operand.
3.2 S se tipreasc expresia de la punctul 3.1. n form postfixat i infixat.
3.3 S se evalueze expresia matematic de la punctul 3.1.
3.4 S se evalueze un arbore care conine n noduri constantele 0 i 1 i operatorii AND, OR, NOT.
3.5 S se scrie funcii de pretty-print (tiprire frumoas) a arborilor.
3.6 S se scrie funcii nerecursive pentru traversarea arborilor.
3.7 Arborele genealogic al unei persoane se reprezint astfel: numele persoanei este cheia nodului
rdcin i pentru fiecare nod cheia descendentului stng este numele tatlui, iar a descendentului drept
este numele mamei. Se citesc dou nume de la tastatur. Ce relaie de rudenie exist ntre cele dou
persoane? Se presupune c o familie are doar un singur fiu.
3.8 S se scrie un program care transform un arbore binar ntr-o list dublu nlnuit.
3.9 S se scrie un program care s interschimbe subarborele drept cu cel stng pentru un nod dat.
3.10 S se scrie o funcie care determin nlimea unui arbore binar.
3.11 S se scrie o funcie care determin numrul de frunze ale unui arbore binar.
3.12 S se scrie o funcie care determin dac doi arbori binari sunt echivaleni (arborii binari sunt
echivaleni dac sunt structural echivaleni i datele corespunztoare nodurilor sunt aceleai).
3.13 S se scrie un program de construire i traversare a unui arbore oarecare conform indicaiilor din
lucrare (paragraful 2.3.).

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