Sunteți pe pagina 1din 26

Cap.

7 Structura de date arbore


7.1 Definitii

 Proprietati ale relatiei de precedenta:


V = { a, b, c, …}
1. Pt. orice a apartinand lui V : a nu il precede pe a
2. Daca a il precede pe b si b il precede pe c, atunci a il precede pe c
3. Daca a si b apartin lui V si a diferit de b, atunci fie a il precede pe b, fie b il
precede pe a
 Proprietatea specifica structurii de vector: a si b apartin lui V si a il precede
pe b, daca nu exista nici un c apartinand lui V astfel incat a il precede pe c
si c il precede pe b, atunci b este succesorul lui a; specific vectorului este
ca orice element cu exceptia ultimului are un singur succesor
 Structura de arbore admite ca orice element sa aiba un numar diferit de
succesori, cu restrictia ca doua elemente nu pot avea aceeasi succesori

SDA curs 12-13 I INFO 2019/2020 1


 Relatia de succesor indusa pe structura de arbore A conduce la
urmatoarele proprietati:
A = { a, b, c, …}
1. Pt. orice a apartinand lui A : a nu il precede pe a
2. Daca a il precede pe b si b il precede pe c, atunci a il precede pe c
3. Pentru orice b si c apartinand lui A astfel incat b nu il precede pe c si c
nu il precede pe a, daca b il precede pe d si c il precede pe e, atunci d
este diferit de e
4. Daca A nu este o multime vida, atunci exista cel putin un element numit
radacina, care precede toate celelalte elemente
 Definitie recursiva: O multime formata din n>=0 elemente de acelasi tip
numite noduri, care, daca nu e vida ( n=0), are un anumit nod numit
radacina, iar restul nodurilor formeaza un numar finit de arbori doi cate
doi disjuncti

SDA curs 12-13 I INFO 2019/2020 2


Notiuni

 subarbore
 succesorul unui nod ( fiu)
 primul fiu ( cel mai din stanga)
 frate drept
 nivel
 inaltime arbore ( numarul maxim de niveluri)
 gradul unui nod ( numarul de succesori)
 inaltimea unui nod: lungimea celui mai lung drum de la nodul respectiv la un
nod terminal
 adancimea unui nod: lungimea drumului unic de la radacina pana la nodul
respectiv
 Pasul intern: lungimea medie a drumurilor de la radacina la un nod
 Pasul extern: lungimea medie a drumurilor la toate nodurile speciale; nod
special este nodul completat astfel incat toate nodurile arborelui sa fie de
acelasi grad

SDA curs 12-13 I INFO 2019/2020 3


7.3 Traversarea arborilor

 Nodurile sunt procesate ( vizitate) intr-o anumita ordine, rezultand astfel o


lista liniara ( liniarizare):
1. Preordine: R, PRE (A1), PRE(A2), …, PRE (Ak)
2. Inordine: INO (A1), R, INO(A2), …, INO(Ak)
3. Postordine: POST(A1), POST(A2), …, POST(Ak), R
 Definitia recursiva a structurii de arbore presupune ca subarborii sai s-au
ordonat deja
 Daca arborele A este vid , atunci ordonarea lui in toate cele trei moduri se
reduce la o lista vida
 Daca arborele A este format dintr-un singur nod, respectiv radacina, atunci
ordonarea lui in toate cele trei moduri se reduce la o lista continand doar
nodul radacina
 Uzual se realizeaza parcurgerea arborilor in sens trigonometric pozitiv,
ramanand cat mai aproape de noduri

SDA curs 12-13 I INFO 2019/2020 4


 Preordine : nodurile se proceseaza prima oara cand sunt intalnite
 Postordine: nodurile se proceseaza la o a doua trecere
 Inordine: nodurile terminale se proceseaza prima data cand sunt intalnite, iar
nodurile interne a doua oara
 Nodurile terminale, in toate cele trei variante de parcurgere, sunt procesate in
aceeasi ordine
 Cele trei moduri de traversare sunt variante ale algoritmului de cautare in
adancime
 O alta metoda de cautare ( implicit si de traversare) este cautarea pe nivel
 Implementarea algoritmilor de traversare a arborilor ( cautare) se realizeaza
atat prin variante recursive, cat si nerecursive; sunt necesare structuri
suplimentare ( cozi, stive) pentru pastrarea informatiilor care urmeaza sa fie
procesate

SDA curs 12-13 I INFO 2019/2020 5


7.3 TDA arbore ( arbore generalizat)

I MM – definit in 7.1
II Notatii: TipNod N;
TipArbore A;
TipCheie …
III Operatori:
TipNod Tata(N, A);/* predecesor(N, A); parinte(N,A);*/
TipNod PrimulFiu(N,A); Insereaza (N, A)
TipNod FrateDrept(N,A); Sterge (N,A)
TipCheie Cheie(N,A); Preordine(A,…)
Creeaza_i(v, A1, A2,…, Ai) Postordine(A,…)
TipNod Radacina(A) Inordine(A,…)
Initializare(A)

SDA curs 12-13 I INFO 2019/2020 6


Implementarea arborilor generali
a)implementarea arborilor cu tablouri

 Fie A un arbore cu n noduri. Nodurile se numeroteaza arbitrar de la 1 la


n. Fiecarui nod i se asociaza un element din tablou (nodul i –> a[i])
 Cea mai simpla reprezentarea prin tablouri a arborelui A , care permite
implementarea facila a operatorului Tata este cea care memoreaza la
intrarea a[i] in tablou un cursor care indica parintele nodului i; aceasta
varianta implementeaza dificil operatorii PrimulFiu si FrateDrept;
parcurgerea in directia nod-> parinte se realizeaza intr-un timp
proportional cu adancimea
 Restrictii: in numerotarea initiala a nodurilor, numerotarea fiilor se
realizeaza numai dupa ce nodul parinte a fost numerotat, numerele
fiilor fiind atribuite crescator de la stanga la dreapta, in ordinea in care
apar in reprezentare

SDA curs 12-13 I INFO 2019/2020 7


b. Implementarea arborilor cu liste

1. Pentru fiecare nod al arborelui se creeaza o lista inlantuita cu succesorii


acestuia
typedef struct nod {
int indice;
struct nod * urm;
}TipNodLista;
typedef struct nod * TipPointerNod;
typedef TipPointerNod TipLista;
typedef int TipNod; //1…MaxNod
typedef struct{
TipLista inceput[MaxNod];
TipCheie chei[MaxNod];
TipNod radacina;
}TipArbore;
2. Liste implementate cu cursori
SDA curs 12-13 I INFO 2019/2020 8
c. Implementarea cu pointeri

 Este posibila daca se admite un grad maxim pentru noduri

typedef struct nod {


TipCheie cheie;
TipInfo info;
struct nod *succ1, * succ2, *succ3;
}TipNod;
typedef TipNod * TipArbore;

SDA curs 12-13 I INFO 2019/2020 9


7. 4 Arbori binari

 O multime de n>=0 elemente numite noduri, care daca nu este vida


contine un anumit nod numit radacina, iar restul nodurilor formeaza 2
arbori binari disjuncti , numiti subarbore stang si subarbore drept
 Se mai numesc si arbori de parcurgere (parse tree), fiind asociati
prelucrarii expresiilor aritmetice
 Structura de arbore binar este importanta:
- Este usor de reprezentat si de prelucrat
- Se bucura de proprietati specifice, fata de proprietatile arborilor
generali
- Orice structura de arbore general poate fi transformata in arbore binar
Obs. Se considera radacina arborelui general ca radacina a arborelui
binar. Primul subarbore A11 devine fiul stang, iar subarborii A1i devin
frati drepti ai subarborilor A 1i-1 pentru i=2…k. Se continua in aceeasi
maniera pentru fiecare din subarborii astfel rezultati. Arborele binar
generat depinde de ordinea in care sunt procesati succesorii.
- Traversarea preorder a arborelui general corespunde traversarii
preorder a arborelui binar
SDA curs 12-13 I INFO 2019/2020 10
 Arborele binar generat depinde de ordinea in care sunt procesati
succesorii
 Pointerul stang al fiecarui nod din ab ( arborele binar generat)
pointeaza spre o sublista continand toti succesorii nodului curent din a
(arborele general )
 La procesarea unui nod curent p din a se parcurg etapele:
- crearea unei subliste continand toti succesorii nodului curent p
- pozitionarea campului pointer stanga al nodului corespunzator din ab
spre sublista de mai sus
- copierea campului info al nodului p din a in campul info al nodului
corespunzator din ab

Solutia consta in traversarea simultana in preordine a arborilor a si ab

SDA curs 12-13 I INFO 2019/2020 11


Varianta nerecursiva:
- Structuri de date suplimentare ( stive, cozi) , una aferenta arborelui
general si una aferenta arborelui binar , in care sunt salvate task-urile
amanate ( de ex.: pointerii dreapta nenuli)

Varianta recursiva:
- daca a are subarbore, genereaza arborele binar corespunzator celui
mai din stanga subarbore al lui a si pune-l ca subarbore stang al lui ab
- pentru toti ceilalti subarbori in ordine, genereaza arborele binar
corespunzator si insereaza-l la sfarsitul ramurii drepte a arborelui binar
anterior

SDA curs 12-13 I INFO 2019/2020 12


TDA arbore binar

 I MM
- o structura de noduri ( de acelasi tip) in care fiecare nod este radacina
unui subarbore si contine trei campuri : informatie ( cu sau fara cheie),
indicator stang si indicator drept
 II Notatii
- w-TipNod; t, s, d – TipArboreBinar ; r, n –TipIndicator
 III Operatori
- CreazaArboreVid(t); ArboreVid( t)->boolean; Radacina( t)->r
- Parinte(n,t)->r; FiuStang(n,t)->r; FiuDrept(n,t)->r
- SuprimaSub(n, t); InlocuiesteSub(n, r, t)
- Furnizeaza(n,t)->w; Actualizeaza (n,w,t); Cauta (w, t)->r
- Preordine (t,..); Inordine(t, …); Postordine(t, …);

SDA curs 12-13 I INFO 2019/2020 13


Implementarea arborilor binari

a.Cu tablouri si cursori


typedef int TipPointerNod;
typedef struct {
char ch;
TipPointerNod stg, dr;
}TipNod;
TipNod tab[MaxNod];
b. Cu tablouri si fara cursori
Numarul maxim de noduri care poata sa apara pe nivelul i al unui arbore
binar este 2 i-1.
Numarul maxim de noduri apartinand unui arbore de inaltimea h este 2h-1
Arborele binar care are exact 2h-1 noduri se numeste arbore binar plin de
inaltime h .
Un arbore binar cu n noduri si inaltime h se numeste arbore binar complet
daca nodurile sale corespund nodurilor numerotate de la 1 la n intr-un arbore
binar plin de inaltime h
SDA curs 12-13 I INFO 2019/2020 14
arbore plin : n= 2h-1
arbore complet : n<= 2h-1
arbore de inaltime minima ( echilibrat): nodurile terminale sunt distribuite pe
cel mult doua niveluri ale arborelui
Daca se reprezinta un arbore binar complet in maniera prezentata (reprezentare
secventiala), atunci pentru orice nod de indice i , 1<=i<=n sunt valabile
relatiile:
Parinte(i) este nodul avand indicele i/2 daca i ≠1. Daca i=1 nodul indicat de i
este radacina si nu are parinte
FiuStanga(i) este nodul de indice 2*i daca 2*i<=n. Daca 2*i>n, atunci nodul i
nu are fiu stang.
FiuDreapta(i) este nodul cu indicele 2*i+1 daca 2*i+1<=n. Daca 2*i+1>n ,
atunci nodul i nu are fiu drept.
Parcurgerea se face simplu, in ambele sensuri. Insertia si stergerea dificile.
c. Cu Pointeri – cea mai naturala si mai flexibila; elimina dezavantajele
reprezentarii secventiale si permite utilizarea proprietatilor recursive

SDA curs 12-13 I INFO 2019/2020 15


Traversarea arborilor binari

 Prin tehnici bazate pe cautarea in adancime (“depth first”)


- preordine : Preordine(A)--->R, Preordine(SS), Preordine(SD)
- inordine : Inordine(SS), R, Inordine(SD)
- postordine: Postordine(SS), Postordine(SD), R
Obs. Traversarea unei structuri de date este in fapt o ordonare liniara a
componentelor sale conform unui protocol.
Ex. Notatia poloneza (postfix), notatia poloneza inversa (prefix), notatia
infix

 Prin tehnica cautarii prin cuprindere ( pe nivel ) (“breadth-first”)

SDA curs 12-13 I INFO 2019/2020 16


TraversarePeNivel(TipNod r)
{
TipCoada coada1, coada2;
initializare(coada1); initializare(coada2);
adauga(r, coada1);
do
{
while (coada1 nu este vida) {
r=cap(coada1); scoate(coada1);
afiseaza ( r )
daca FiuStanga(r) nu este nodul vid atunci
adauga(FiuStanga( r) , Coada2);
daca FiuDreapta ( r) nu este nodul vid atunci
adauga (FiuDreapta( r), Coada2)
}
SDA curs 12-13 I INFO 2019/2020 17
while (coada2 nu este vida){
r=cap(coada2); scoate(coada2);
afiseaza( r);
daca FiuStanga ( r) nu este nodul vid atunci
adauga ( FiuStanga ( r), Coada1);
daca FiuDreapta( r) nu este nodul vid atunci
adauga ( FiuDreapta ( r ), coada1);
}
}while( coada1 este vida si coada2 este vida);
}

SDA curs 12-13 I INFO 2019/2020 18


Arbori binari cu legaturi (“threaded trees”)

 Implementarile bazate pe indicatori ( cursori sau pointeri) permit


percurgerea simpla in directie descendenta a unui arbore ( recursiv sau
iterativ)
 Parcurgerea ascendenta se poate obtine daca in fiecare moment este
memorat si parintele nodului curent ( consum ridicat de memorie)
 O solutie consta in suplimentarea nodurilor cu un camp de inlantuire spre
nodul parinte ( in maniera listelor dublu inlantuite )
 O alta solutie este modificarea campurilor de inlantuire existente astfel incat
ele sa indice noduri in arbore care preced sau succed nodul in cauza intr-o
anumita ordine de traversare ; in acest caz este necesara modificarea
structurii nodului pentru a evidentia natura acestor campuri ( pointeri -
indica fii ai nodului sau legaturi- care indica predecesori sau succesori la
parcurgerea in inordine)
 Un arbore cu legaturi poate fi partial daca numai unul din campuri este
folosit ca si lagatura sau plin, daca se utilizeaza ambele campuri.

SDA curs 12-13 I INFO 2019/2020 19


Tipuri de arbori binari

 Arbori binari ordonati ( arbori de cautare “binary search trees”)


- proprietate: daca n este un nod oarecare al arborelui, avand cheia c, atunci
toate nodurile din subarborele stang al lui n au cheile mai mici sau egale cu c,
si toate nodurile din subarborle drept al lui n au chei mai mari sau egale cu c
- la parcurgerea in inordine se obtine secventa monoton crescatoare a cheilor
nodurilor arborelui
- o cautare intr-un arbore binar ordonat necesita log2n comparatii de chei, daca
nodurile s-au organizat intr- o structura de arbore binar ordonat de inaltime
minima
- in cazul cel mai defavorabil arborele degenereaza intr-o structura de lista
liniara
- nodurile cu chei extreme sunt situate in extremitatile arborelui si sunt cel mult
de ordinul 1 (nodul cu cheia minima nu are subarbore stang, iar cel cu cheia
maxima nu are subarbore drept)
- orice modificare in arborele de cautare trebuie sa conserve proprietatile
acestuia
SDA curs 12-13 I INFO 2019/2020 20
 Arbori binari partial ordonati ( arbori de selectie )
- este un arbore binar de inaltime minima h=log 2 n
- toate nivelele, eventual cu exceptia ultimului sunt complete;
completarea ultimului nivel se va face intotdeauna de la stanga la
dreapta
- cheile oricarei perechi de noduri tata-fiu respecta relatia de ordine
prestabilita, respectiv cheia oricarui nod nu este mai mare ( mica)
decat cheile fiilor sai
- reprezentarea statica cu structura de tablou este cunoscuta sub
denumirea de ansamblu ( heap); d.p. d. v. al reprezentarii este un
arbore binar complet
- sunt utilizati in aplicatiile in care inserarile si extragerile sunt frecvente,
iar ordinea de extragere este definita printr-o relatie de ordine specifica
aplicatiei (ex: coada cu prioritati)

SDA curs 12-13 I INFO 2019/2020 21


Exemple de operatori

preordine_1(pointerarbbin *arb) // recursiv


{
pointerarbbin s, d, stg(..), dr(..);
if (*parb !=NULL)
{
procesare(parb);
s=stg(*parb);
preordine_1(&s);
d=dr(*parb);
prordine_1(&d);
}
}

SDA curs 12-13 I INFO 2019/2020 22


preordine_2(pointerarbbin *parb) // nerecursiv cu salvarea pointerilor dreapta
{
pointerarbbin p, stg(), dr(), setnull(), null;
stiva s;
null=setnull();
initializare(&s);
p=*parb;
while((p!=null)|| !verif(&s))
if(p!=null){
procesare(parb,p);
push(dr(p),&s);
p=stg(p);
}
else
pop(&s,&p);
}
Cand un subarabore stang a fost deja traversat complet, stiva va contine
pointerii la toti subarborii dreapta a caror traversare a fost amanata; varful stivei
contine pointerul la subarborele dreapta al nodului pointat de p

SDA curs 12-13 I INFO 2019/2020 23


preordine_3(pointerarbbin *parb)
{
pointerarbbin null, p, q, ptr_dr;
pointerarbbin setnull(), stg(), dr(), elem();
stiva s;
null=setnull();
initializare(&s);
p=*parb;
while((p!=null)||!verif(&s))
if(p!=null)
{
procesare(parb,p);
if(stg(p)!=null)
{
push(p,&s);
p=stg(p);
}
else
{
push(p,&s)
p=dr(p)
}
}
SDA curs 12-13 I INFO 2019/2020 24
else
{
do
{
pop(&s,&q);
if(!verif(&s))
ptr_dr=dr(elem(&s));
else
ptr_dr=null;
}
while(!verif(&s)&&(q==ptr_dr));
if(q!=ptr_dr)
p=ptr_dr;
}
}

SDA curs 12-13 I INFO 2019/2020 25


SDA curs 12-13 I INFO 2019/2020 26

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