Sunteți pe pagina 1din 32

Arbori concepte i operaii

Gabriel Dragomir
(gabriel.dragomir@cs.utcluj.ro)
1

Arbore binar
Orice nod are cel mult doi descendeni:
 fiu stng
 fiu drept

Operaii:
 Construire
 Traversare
 tergere
2

Arbore binar Exemplu

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

Arbore binar - concepte


Nod rdcin (root)
 Nodul cel mai de sus n structur (A)

Subarbore (subtree)
 Stng sau drept mulimea de noduri coninut
de structura ce ncepe cu fiul stng sau drept
(subarborele stng al lui A conine nodurile: B, D,
G)

Nod fiu, Nod printe


 n exemplul din slide-ul precedent A este printe
pentru B i C, care sunt fiii lui A
4

Arbore binar - concepte


 Nod descendent
 Un nod la care se poate ajunge plecnd de la un nod printe
ctre un nod fiu (G este descendent al lui B)

 Nod ascendent
 Un nod la care se poate ajunge plecnd de la un nod fiu
ctre nodul printe (C este ascendent al lui H)

 Nod frunz (leaf)


 Un nod ce nu are fii (G, E, H sunt noduri frunze)

 Nod intern
 Un nod cu cel puin un fiu (B, C, D, F)
5

Arbore binar - concepte


Arc (edge)
 O conexiune ntre dou noduri adiacente
(printe fiu sau fiu printe)

Cale (path)
 O secven de noduri i arce ntre un nod i un
descendent

Nivel (level)
 1 + numrul de arce de la nod la nodul rdcin

Adncime (depth)
 Numrul de arce de la nod la nodul rdcin
6

Arbore binar - concepte


nlime (height)
 nlimea unui nod este numrul maxim de arce
ce trebuie traversate pentru a atinge un nod
frunz plecnd de la acel nod (A 3, F 1, G - 0)
 nlimea arborelui este numrul de arce pe calea
maxim de la rdcin la frunze (3 n exemplu)

Arbore complet
 Un arbore n care fiecare nod frunz se gsete la
aceeai distan de nodul rdcin

Pdure
 O mulime format din arbori disjunci
7

Arbore binar Implementare


typedef struct tip_nod
{
char ch; // identificatorul nodului
informaie util;
struct tip_nod *st, *dr; // cei doi fii
} TIP_NOD;
8

Arbore binar - Traversare

Lrgime
A, B, C, D, E, F, G, H

Adncime
A, B, D, G, C, E, F, H
9

Arbore binar - Traversare

Preordine
A, B, D, G, C, E, F, H

Postordine
G, D, B, E, H, F, C, A
10

Arbore binar - Traversare

Inordine
D, G, B, A, E, C, F, H
11

Arbore binar - Construire


Rdcina
 Unic

Preordine
Implementare:
TIP_NOD *construire( )
{
TIP_NOD *p = NULL;
char c;
scanf(%c, &c);
if(c != *)
12

Arbore binar - Construire


{
p=(TIP_NOD *)malloc(sizeof(TIP_NOD));
/* introducere de informaie n nod */
p->ch = c;
p->stg = construire( );
p->dr = construire( );
}
return p;
}
 n programul principal:
radacina = construire ( )
13

Arbore binar - Traversare


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);
}
}
14

Arbore binar - Traversare


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);
}
}
15

Arbore binar - Traversare


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);
}
}
16

Arbori binari total echilibrai


 Numrul nodurilor unui oricare subarbore
stng difer cu cel mult 1 n plus fa de
numrul nodurilor subarborelui drept
 Frunzele se gsesc pe ultimele dou niveluri
 Algoritm de construire:
1. un nod este rdcin;
2. se iau nstg = [n/2] noduri pentru arborele stng
i se trece la construirea lui (pasul 1);
3. se iau cele ndr = n - nstg-1 noduri rmase pentru
subarborele drept i se trece la construirea lui
(pasul 1).
17

Arbori binari total echilibrai


Implementare
TIP_NOD *construire_echilibrat(int nr_noduri)
{
TIP_NOD *p = NULL;
int n_stg, n_dr, inf;
if(nr_noduri != 0)
{
n_stg = nr_noduri/2; // numrul nodurilor din subarborele stng
n_dr = nr_noduri - n_stg - 1; //
~
drept
p = (TIP_NOD *)malloc(sizeof(TIP_NOD));
18

Arbori binari total echilibrai


Implementare
printf("\nIntroduceti informatia din nod in preordine ");
scanf("%d", &(p->nr));
p->stg = construire_echilibrat(n_stg);
p->dr = construire_echilibrat(n_dr);
}
return p;
}
 n programul principal:
radacina = construire_echilibrat (nr_total_noduri);
19

Arbori oarecare
Nodurile au mai mult de doi descendeni
Construire:
 Nodurile sunt citite n postordine i adresele sunt
pstrate ntr-o stiv pn cnd apare nodul printe;
 Pentru fiecare nod se citete informaia util i
numrul de fii;
 n momentul citirii unui nod printe, adresele fiilor
sunt scoase din stiv, i sunt trecute n nodul
printe, dup care adresa nodului printe este pus
n stiv;
 n final singura adres din stiv va fi cea a nodului
rdcin.
20

Arbori oarecare
 Traversare n lrgime:


se utilizeaz o coad pentru pstrarea adreselor


nodurilor ce urmeaz s fie prelucrate

1. iniial coada este vid;


2. se introduce n coad adresa rdcinii;
3. se scoate pe rnd din coad adresa a cte
unui nod, se prelucreaz informaia din nod,
iar apoi se introduc adresele fiilor nodului
respectiv;
4. Se repeta pasul 3 pn cnd coada devine
vid.
21

Arbori oarecare- Implementare


typedef struct tip_nod
{
int cod;
int nr_fii; // numrul de fii
struct tip_nod *adr_fii [MAXFII]; // adresele nodurilor fiu
} TIP_NOD;
typedef struct nod_lista
{
TIP_NOD *ptr; // adres nod arbore
struct nod_lista *urm;
} NOD_LISTA;
22

Arbori oarecare- Implementare


TIP_NOD *radacina;
NOD_LISTA *prim, *ultim;
TIP_NOD *construire_oarecare()
{
TIP_NOD *p;
int n; // numrul total de noduri
int i;
printf(\nIntroduceti nr. total de noduri);
scanf(%d, &n);
prim = 0; // iniializare stiv
while(n > 0)
23

Arbori oarecare- Implementare


{
p = (TIP_NOD *)malloc(sizeof(TIP_NOD));
if(p == NULL)
{
printf(\nNU s-a alocat memorie);
return p;
}
printf(\nCodul nodului= );
scanf(%d, &p->cod);
printf(\nNumarul de fii= );
scanf(%d, &p->nr_fii);
i = p->nr_fii;
24

Arbori oarecare- Implementare


while(i > 0)
{ // se aduc din stiv adresele fiilor
if(p->adr_fii[i] = pop() == NULL)
{

printf(\nEroare de introducere);
return NULL;
}
i--;
}
25

Arbori oarecare- Implementare


/* punerea pointerului p n stiv */
if(push(p) == NULL)
{

printf(\nEroare la adaugare pe stiva);


return NULL;
}
n--;
}
return pop();
}

26

Arbori oarecare- Implementare


int traversare(TIP_NOD *rad)
{ // traversarea pe orizontal dup nivel
TIP_NOD *p;
int i;
prim = ultim = NULL;
if(adaug(rad) == 0) return 0;
do
{
p = elimina(); // elimin din coad un nod
if(p != NULL)
{ // prelucrare informaie din nod
printf(Codul nodului= %d\n, p->cod);
27

Arbori oarecare- Implementare


/* se trec n coad adresele fiilor */
for(i = 1; i <= p->nr_fii; i++)
{
if(adaug(p->adr_fii[i]) == NULL) return 0;
}
}
} while( p!= NULL);
return 1;
}

Funciile push(), pop() au fost prezentate la


STIV, iar adaug(), elimin() au fost prezentate
la COAD
28

Arbori oarecare- Implementare


int push(TIP_NOD *p) // returneaz 1 succes, 0 insucces
{ // pune adresa unui nod al arborelui pe stiv
NOD_LISTA *q = (NOD_LISTA *)malloc(sizeof(NOD_LISTA));
if(q == NULL)
{

printf(\nEroare la alocare spatiu pentru un nod al stivei! \n);


return 0;
}
else
{
q->ptr = p;
q->urm = prim;
prim = q;
return 1;
}
}

29

Arbori oarecare- Implementare


TIP_NOD *pop()
{ // extrage adresa unui nod al arborelui din vrful stivei
TIP_NOD *p;
NOD_LISTA *q;
if(prim == 0) return 0;
else
{
q = prim;
prim = prim->urm;
if(prim == 0) ultim = 0;
p = q->ptr;
free(q);
return p;
}
}
30

Arbori oarecare- Implementare


int adaug(TIP_NOD *p) // returneaz 1 succes, 0 insucces
{ // pune adresa unui nod al arborelui n coad
NOD_LISTA *q = (NOD_LISTA *)malloc(sizeof(NOD_LISTA));
if(q == NULL)
{

printf(\nEroare la alocare spatiu pentru un nod al cozii! \n);


return 0;
}
q->ptr = p;
q->urm = 0;
if(prim == 0)
{
prim = q;
ultim = q;
}
else

31

Arbori oarecare- Implementare


ultim->urm = q;
ultim = q;
}
return 1;
}
TIP_NOD *elimin()
{ // elimin un nod din coad
TIP_NOD *p;
NOD_LISTA *q;
if(prim == 0) return 0;
else
{
q = prim;
prim = prim->urm;
p = q->ptr;
free(q);
return p;
}
}
32

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