Documente Academic
Documente Profesional
Documente Cultură
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**
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;
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.).