Arbori
8.1. Arbori generalizai
8.1.1. Definiii
Se poate verifica uor c relaia astfel definit are urmtoarele proprieti, valabile
pentru structura de vector:
Proprietatea (3) precizeaz c relaia de preceden este definit pentru oricare dou
elemente a i b ale lui V, cu singura condiie ca a b.
Fie V o mulime finit peste elementele creia s-a definit o relaie de preceden,
stabilind referitor la fiecare pereche de elemente, care dintre ele l precede pe celallalt.
n figura 8.1.1.b apare o alt reprezentare intuitiv a unei structuri de vector. Sgeile
din figur indic relaia "succesor".
Aceast relaie se definete cu ajutorul relaiei de preceden dup cum urmeaz: dac
ntre elementele a i b ale lui V este valabil relaia a p b i nu exist nici un c V astfel
ca a p c p b atunci se zice c b este succesorul lui a.
nivelul 1
nivelul 2
.
e
nivelul 3
nivelul 4
n
o
nivelul 5
(4) Dac A nu este vid (n >0) atunci exist un element numit rdcin, care
precede toate celelalte elemente.
-------------------------------------------------------------
Pentru structura de arbore se poate formula i o alt definiie echivalent cu cea de mai
sus.
Prin arbore, se nelege o mulime de n 0 noduri de acelai tip, care dac nu este vid,
atunci are un anumit nod numit rdcin, iar restul nodurilor formeaz un numr finit
de arbori, doi cte doi disjunci.
Un arbore parial nu este ntotodeauna subarbore pentru arborele complet, dar orice
subarbore este un arbore parial.
ntr-o structur de arbore, succesorul unui nod se mai numete i "fiul" sau "urmaul"
su.
Dac un nod are unul sau mai muli fii, atunci el se numete "tatl" sau "printele"
acestora.
Dac un nod are mai muli fii, acetia se numesc "frai" ntre ei.
Spre exemplu n fig. 8.1.1.c nodul b este tatl lui e, f i g care sunt frai ntre ei i
sunt n acelai timp fiii lui b.
Se observ c ntr-o structur de arbore, arborele parial determinat de orice nod diferit
de rdcin, este subarbore pentru arborele parial determinat de tatl su.
Astfel f este tatl lui m, iar arborele parial determinat de m este subarbore pentru
arborele parial determinat de f.
Dac n1, n2,....,nk este o secven de noduri aparinnd unui arbore, astfel nct ni este
printele lui ni+1 pentru 1 i< k, atunci aceast secven se numete "drum" sau "cale"
de la nodul n1 la nodul nk.
Lungimea unui drum este un ntreg avnd valoarea egal cu numrul de ramuri (sgei)
care trebuiesc traversate pentru a ajunge de la rdcin la nodul respectiv.
Spre exemplu, n figura 8.1.1.c, lungimea drumului la nodul d este 2 iar la nodul
p este 5.
Dac exist un drum de la nodul a la nodul b, atunci nodul a se numete strmo sau
ancestor al lui b, iar nodul b descendent sau urma al lui a.
Conform celor deja precizate tatl unui nod este strmoul su direct (predecesor) iar
fiul unui nod este descendentul su direct (succesor).
Un strmos respectiv un descendent al unui nod, altul dect nodul nsui, se numete
strmo propriu respectiv descendent propriu.
Pornind de la aceast definiie, nlimea unui arbore se poate defini i ca fiind egal cu
nlimea nodului rdcin.
Adncimea unui nod este egal cu lungimea drumului unic de la rdcin la acel nod.
n practic se mai definete i lungimea drumului unui arbore numit i lungimea
drumului intern, ca fiind egal cu suma lungimilor drumurilor corespunztoare tuturor
nodurilor arborelui.
----------------------------------------------------------1 h
PI = ni * i
unde n = numrul total de noduri
n i =1
i = nivelul nodului
[8.1.1.c]
ni =numrul de noduri pe nivelul i
h = nalimea arborelui
La fel ca i n cazul altor tipuri de structuri de date, este dificil de stabilit un set de
operatori care s fie valabil pentru toate aplicaiile posibile ale structurilor de tip arbore.
Cu toate acestea, din mulimea operatorilor posibili se recomand pentru TDA Arbore
generalizat forma prezentat n secvena [8.1.2.a].
------------------------------------------------------------TDA Arbore generalizat
Modelul matematic: arbore definit n sens matematic.
Elementele arborelui aparin unui aceluiai tip, numit
i tip de baz.
Notaii:
TipNod - tipul unui nod al arborelui;
TipArbore - tipul arbore;
TipCheie - tipul cheii unui nod;
N: TipNod;
A: TipArbore;
v: TipCheie;
[8.1.2.a]
Operatori:
1. Tata(N: TipNod, A:TipArbore): TipNod; - operator
care returneaz tatl (printele) nodului N din
arborele A. Dac N este chiar rdcina lui A se
returneaz "nodul vid";
2. PrimulFiu(N: TipNod, A: TipArbore): TipNod; operator care returneaz cel mai din stnga fiu al
nodului N din arborele A. Dac N este un nod
terminal, operatorul returneaz "nodul vid".
3. FrateDreapta(N: TipNod, A:TipArbore): TipNod;
operator care returneaz nodul care este fratele
drept "imediat" al nodului N din arborele A. Acest
nod se definete ca fiind nodul M care are acelai
printe T ca i N i care n reprezentarea arborelui
apare imediat n dreapta lui N n ordonarea de la
stnga la dreapta a fiilor lui T.
4. Cheie(N: TipNod, A: TipArbore): TipCheie; - operator
care returneaz cheia nodului N din arborele A.
Una din activitile fundamentale care se execut asupra unei structuri arbore este
traversarea acesteia.
Ca i n cazul listelor liniare, prin traversarea unui arbore se nelege execuia unei
anumite operaii asupra tuturor nodurilor arborelui.
n timpul traversrii, nodurile sunt vizitate ntr-o anumit ordine, astfel nct ele pot fi
considerate ca i cum ar fi integrate ntr-o list liniar.
Descrierea i nelegerea celor mai muli algoritmi este mult uurat dac n cursul
prelucrrii se poate preciza elementul urmtor al structurii arbore, respectiv se poate
liniariza structura arbore.
Cum subarborii au noduri strict mai puine dect arborele complet, rezult c,
aplicnd recursiv de un numr suficient de ori definiia, se ajunge la ordonarea
unui arbore vid, care este evident.
Cele trei moduri de traversare ale unui arbore generalizat A se definesc recursiv dup
cum urmeaz:
A1
A2
. . .
Ak
Spre exemplu pentru arborele din figura 8.1.3.1.b (a), traversrile anterior definite,
conduc la urmtoarele secvene de noduri:
preordine: 1,2,3,5,8,9,6,10,4,7.
postordine: 2,8,9,5,10,6,3,7,4,1.
inordine: 2,1,8,5,9,3,10,6,7,4.
1
10
10
(a)
(b)
Pentru postordine nodurile se listeaz ultima dat cnd sunt ntlnite, respectiv
cnd sensul de parcurgere este spre prinii lor: 2, 8, 9, 5, 10, 6, 3, 7, 4, 1;
Pentru inordine, un nod terminal se listeaz cnd este ntlnit prima oar, iar
un nod interior cnd este ntlnit a doua oar: 2, 1, 8, 5, 9, 3, 10, 6, 7, 4.
-----------------------------------------------------------Exemplul 8.1.3.1.a. Implementarea traversrii n preordine a unui arbore
utiliznd operatorii definii n cadrul TDA Arbore generalizat, varianta recursiv.
(2) n acest moment se trece n cel de-al doilea mod de operare care
presupune revenirea pe drumul memorat n stiv, eliminnd pe rnd
nodurile, pn la ntlnirea primului nod care are frate drept.
IF m<>0 THEN
BEGIN
Write(Cheie(m,a));
Push(m,s);
m:=PrimulFiu(m,a) {exploreaz fiul stng}
END
ELSE
IF Stivid(s) THEN
gata:=true
[8.1.3.1.d]
ELSE
BEGIN
m:=FrateDreapta(VarfSt(s),a);
Pop(s)
END
END; {TraversarePreordineNerecursiva}
------------------------------------------------------------
8.1.3.2. Traversarea arborilor generalizai prin tehnica cutrii prin
cuprindere
Tehnica cutrii prin cuprindere deriv tot din traversarea grafurilor, dar ea este
utilizat, e adevarat mai rar, i la traversarea arborilor [Ko86].
Principiul acestei tehnici este simplu: nodurile nivelului i+1 al structurii arbore sunt
vizitate doar dup ce au fost vizitate toate nodurile nivelului i (0<i<h, unde h este
nlimea arborelui).
-----------------------------------------------------------
n cadrul acestui subcapitol se vor prezenta cteva din implementrile posibile ale
structurii arbore generalizat, corelate cu aprecieri referitoare la capacitatea acestora de
a suporta operatorii definii n cadrul TDA Arbore generalizat.
8.1.4.1. Implementarea arborilor generalizai cu ajutorul tablourilor
Cu alte cuvinte, dac A[i] = j atunci nodul j este printele nodului i iar dac
A[i]= 0, atunci nodul i este rdcina arborelui.
Acest mod de reprezentare, face uz de proprietatea arborilor care stipuleaz c orice nod
are un singur printe, motiv pentru care se numete i "indicator spre printe".
Gsirea printelui unui nod se face ntr-un interval constant de timp O(1) iar
parcurgerea arborelui n direcia nod - printe, se realizeaz ntr-un interval de timp
proporional cu adncimea nodului.
(1)
(2)
(4)
(6)
(5)
(7)
(9)
(8)
(3)
(10)
(a)
10
10
Chei
(b)
MaxNod
1
2
3
4
5
6
7
8
9
10
r
b
c
d
e
h
i
j
f
g
chei
1
1
2
3
4
5
6
7
8
9
10
indice urm
Nil
Nil
Nil
Nil
Nil
Nil
inceput
Nil
5 Nil
10 Nil
7
8 Nil
Fiecare nod al arborelui este identificat prin indexul celulei pe care el o ocup n
tabloul Zona
Disponibil
cheie
frateDreapta
tata
11
10
10
10
11
a
c
10
MaxNod
Zona
cheie:TipCheie;
frateDreapta:TipCursor;
tata:TipCursor
END;
Disponibil:TipCursor;
R:TipArbore;
------------------------------------------------------------ n secvena [8.1.4.3.c] este prezentat un exemplu de implementare a operatorului
Creaza2, pornind de la reprezentarea propus.
Prin arbore binar se nelege o mulime de n 0 noduri care dac nu este vid, conine
un anumit nod numit rdcin, iar restul nodurilor formeaz doi arbori binari disjunci
numii: subarborele stng respectiv subarborele drept.
b
(a)
c
(b)
b
(c)
(d)
Structurile (a) i (b) din fig.8.2.1.a. dei conin noduri identice, reprezint arbori binari
diferii deoarece se face o distincie net ntre subarborele stng i subarborele drept al
unui arbore binar.
Acest lucru este pus i mai pregnant n eviden de structurile (c) i (d) din fig.8.2.1.a.
care de asemenea reprezint arbori diferii.
(6)
(1)
(2)
(3)
(4)
(9)
(7)
(8)
(10)
(5)
(11)
Fie un arbore generalizat oarecare A, care are rdcina A1 i subarborii A11, A12...,A1k.
Transformarea acestuia ntr-un arbore binar se realizeaz dup cum urmeaz:
Se ia A1 drept rdcin a arborelui binar,
Se face subarborele A11 fiul su stng,
Apoi fiecare subarbore A1i se face fiul drept al lui A1,i-1 pentru 2ik.
Grafic, aceast tehnic apare reprezentat n figura 8.2.2.a, (a)-cazul general i (b)-un
exemplu.
A1
B
A11
A12 ...
A1k
E
A1
A11
A12
D
A1k
H
I
(a)
(b)
Pentru implementarea unui arbore binar se poate utiliza o structur de tablou liniar
definit dup cum urmeaz [8.2.4.1.a]:
TYPE TipCursor=0..MaxNod;
TipElement=RECORD
Op:char;
[8.2.4.1.a]
stang,drept:TipCursor
END;
TipArbore=ARRAY[TipCursor] OF TipElement;
VAR T:TipArbore;
------------------------------------------------------------
(6)
(1)
(2)
(3)
(4)
(9)
(7)
(8)
(10)
(5)
(11)
1
2
3
4
5
6
7
8
9
10
11
Op
stang
*
+
/
*
a
b
c
d
e
f
2
6
9
7
10
0
0
0
0
0
0
drept
3
4
5
8
11
0
0
0
0
0
0
Lema 1. Numrul maxim de noduri al nivelului i al unui arbore binar este 2i-1.
Ca atare, numrul maxim de noduri al unui arbore de nlime h este [8.2.4.1.b].
------------------------------------------------------------NrMax =
i 1
= 2h 1
pentru
h >0
[8.2.4.1.b]
i =1
-------------------------------------------------------------
Arborele binar de nlime h care are exact 2h-1 noduri se numete arbore
binar plin de nlime h.
A
B
10
11
12
13
14
15
Arbore
1
A
2
B
5
E
6
F
10 11
12 13 14 15
Lema 2. Dac se reprezint un arbore binar plin ntr-o manier conform cu cele
anterior precizate, atunci pentru orice nod avnd indicele i,1in sunt valabile
relaiile:
1. Parinte(i) este nodul avnd indicele i/2 dac i1. Dac i=1
nodul indicat de i este nodul rdcin care nu are printe.
2. FiuStanga(i) este nodul avnd indicele 2*i dac 2*in. Dac
2*i>n, atunci nodul i nu are fiu stng.
3. FiuDreapta(i) este nodul avnd indicele 2*i+1 dac 2*i+1n.
Dac 2*i+1>n, atunci nodul i nu are fiu drept.
Acest mod de implementare poate fi n mod evident utilizat pentru orice structur de
arbore binar, n marea majoritate a cazurilor rezultnd ns o utilizare ineficient a zonei
de memorie alocate tabloului.
10
11
12
13
14
15
Inseria sau suprimarea unui nod trebuie s fie nsoit de schimbarea poziiei
unor noduri din tablou, astfel nct acesta s reflecte modificrile survenite prin
poziiile nodurilor rmase.
Maniera cea mai natural i cea mai flexibil de reprezentare a arborilor binari este cea
bazat pe TDA Indicator.
Un arbore binar poate fi descris cu ajutorul unei structuri de date dinamice n variant
Pascal (secvena [8.2.4.2.a]) respectiv n variant C (secvena [8.2.4.2.b]).
-----------------------------------------------------------{Implementarea arborilor binari cu ajutorul pointerilor}
TYPE RefTipNod=^TipNod;
TipNod=RECORD
cheie:char;
[8.2.4.2.a]
stang,drept: RefTipNod
END;
TipArboreBinar= RefTipNod;
------------------------------------------------------------// implementare C
typedef struct nod
{
//diferite campuri
char cheie;
struct nod* stang;
[8.2.4.2.b]
struct nod* drept;
}NOD;
------------------------------------------------------------
n fig.8.2.4.2.a se poate urmri reprezentarea arborelui binar din figura 8.2.4.1.a bazat
pe definiia din secvena [8.2.4.2.a.].
Este uor de vzut c practic orice arbore poate fi reprezentat n acest mod.
n cadrul cursului de fa, aceast modalitate de reprezentare va fi n mod preponderent
utilizat.
(6)
(1)
(2)
(3)
(4)
(9)
(7)
(8)
(10)
(5)
(11)
Radacina
a
nil
nil
nil
b
nil
c
nil
nil
*
nil
e
nil
nil
f
nil
nil
nil
Cnd s-a ajuns la o frunz, se revine pe drumul parcurs la proximul nod care are
fii neexplorai i parcurgerea se reia n aceeai manier pn la traversarea
integral a structurii.
Schema este bun dar presupune memorarea drumului parcurs, ca atare necesit
fie o implementare recursiv fie utilizarea unei stive.
------------------------------------------------------------
SD
SS
(6)
(1)
(2)
(3)
(4)
(9)
(7)
(8)
(10)
(5)
(11)
Preordine: *+a/bc-d*ef
Inordine: a+b/c*d-e*f
Postordine: abc/+def*-*
[8.2.5.1.c]
PROCEDURE Postordine(r:RefTipNod);
BEGIN
IF r<>nil THEN
BEGIN
Postordine(r^.stang);
Postordine(r^.drept);
Viziteaza(r^)
END
END; {Postordine}
------------------------------------------------------------------------
Dintre aplicaiile specifice arborilor binari se prezint una singur considerat mai
reperezentativ:
o Construcia unui arbore binar de nalime minim
Restricia care se impune este aceea, ca arborele construit s aib nlimea minim.
Pentru aceasta este necesar ca fiecrui nivel al structurii s-i fie alocate numrul
maxim de noduri posibile, cu excepia nivelului de baz.
Acest lucru poate fi realizat prin distribuirea n mod egal a nodurilor care se
introduc n structur pe stnga respectiv pe dreapta fiecrui nod deja introdus.
Regula dup care se asigur distribuia egal pentru un numr cunoscut de noduri n
poate fi formulat simplu n termeni recursivi:
1o Se ia un nod drept rdcin;
2o Se genereaz subarborele stng cu ns=n DIV 2 noduri;
3o Se genereaz subarborele drept cu nd=n-ns-1 noduri.
Acest algoritm, permite construcia simpl a unui arbore binar de nalime minim.
Un arbore binar este considerat perfect echilibrat dac pentru fiecare nod,
numrul de noduri al subarborelui stng difer de cel al subarborelui drept cu cel
mult o unitate.
[8.2.7.1.a]
{
//constructie arbore perfect echilibrat cu N noduri
NOD* NodNou;
int x, ns, nd;
if ( n == 0 )
return NULL;
ns = n / 2;
nd = n - ns - 1;
scanf( "%d", &x );
[8.2.7.1.a]
//citete coninut nod
Aceast modalitate de reprezentare grafic a arborilor binari este una dintre cele mai
simple i imediate, ea recomandndu-se n mod deosebit n aplicaiile didactice.