Sunteți pe pagina 1din 13

LICEUL TEORETIC CU PROFIL DE ARTEMIHAIL BEREZOVSCHI

DISCIPLINA:Informatica
TITLUL REFERATULUI:Arbori

Profesor: Mihai Gandrabura


Elev:Ceban Cristina

binari

O clas foarte important de arbori cu rdcin o constituie arborii binari. Un arbore


binar este un arbore cu rdcin n care gradul oricrui vrf este cel mult egal cu
doi. Putem defini recursiv arborii binari astfel :
Definiie
Un arbore binar este un arbore care fie este vid fie const din const dintr-un nod
rdcin i doi arbori binari disjunci numii subarborele stng, respectiv subarborele drept.
Se face o distincie clar ntre subarborele drept i cel stng. Dac subarborele stng este nevid,
rdcina lui se numete fiul stng al rdcinii..Analog, dac subarborele drept este nevid,
rdcina lui se numete fiul drept al rdcinii.
Clase de arbori binari:
1. Arbori binari strici sunt arborii binari n care orice vrf are gradul zero (este terminal )
sau doi (are exact doi fii).
2. 2. Arbori binari plini sunt arbori binari care au 2k-1 vrfuri dispuse pe nivelurile 0, 1, ... ,
k-1, astfel nct pe fiecare nivel i se gsesc 2i vrfuri.
3. Arborii binari complei sunt arbori binari care se obin
dintr-un arbore binar plin prin
eliminarea din dreapta ctre stnga a unor noduri de pe ultimul nivel. Mai exact, pentru a
construi un arbore binar complet cu n noduri, determinm k astfel nct 2k n < 2k1
k log2n.Construim arborele binar plin cu 2k1-1 noduri i eliminm de pe ultimul nivel
nodurile 2k1-1, 2k1-2, ..., n1
4. . Arbori binari degenerai- sunt arbori binari cu n vrfuri dispuse pe n niveluri.
5. Arbori binari echilibrai - sunt arbori binari n care, pentru orice nod, numrul nodurilor
din subarborele drept i numrul nodurilor din subarborele stng difer cu cel mult o
unitate

Proprieti ale arborilor binari


Proprietatea 1.
Numrul maxim de noduri de pe nivelul i al unui arbore binar este 2i.
Demonstraie:
Vom proceda prin inducie dup numrul nivelului.
P(0)

Pe nivelul i 0 se gsete un singur nod (rdcina).

P(k)

Presupunem c numrul maxim de noduri de pe nivelul k este


2k.

P(k1) Vom demonstra c pe nivelul k1 sunt cel mult 2k1 noduri.


Pe nivelul k1 se gsesc fiii nodurilor de pe nivelul k. Din ipoteza inductiv, pe nivelul k se
gsesc cel mult 2k noduri, iar fiecare nod poate avea cel mult doi fii, deci pe nivelul k1 se
gsesc cel mult 2*2k 2k1 noduri.

Proprietatea 2.
Numrul maxim de noduri ntr-un arbore cu nlimea h este 2h1-1.
Demonstraie:
Numrul maxim de noduri ntr-un arbore cu nlimea h se obine atunci cnd fiecare
nivel i este plin, deci, conform propoziiei anterioare, conine 2i noduri. Numrul maxim de
noduri ntr-un arbore cu nlimea h va fi:
h

i
h1
1
2 2

i 0

Proprietatea 3.
n orice arbore binar nevid cu n0 noduri terminale exist n0-1 noduri de grad 2.
Demonstraie:
Notm cu n0 numrul de noduri terminale, cu n1 numrul de noduri de grad 1 i cu n2
numrul de noduri de grad 2. Deci, numrul total de noduri
nn0n1n2.
Dac numrm muchiile dintr-un arbore binar, observm c fiecare nod, cu excepia
rdcinii, are o singur muchie orientat spre el. Notnd m numrul de muchii obinem n m1.
Dar orice muchie provine de la un nod de grad 1 sau 2, rezult c m n12n2.
Din n0n1n2 n i n12n2 n-1 n2 n0-1.
Proprietatea 4.
Un arbore cu n vrfuri are nlimea cel puin egal cu log2n.
Demonstraie:
n cazul cel mai favorabil, nodurile sunt dispuse pe niveluri astfel nct fiecare nivel s
fie plin, cu excepia, eventual, a ultimului nivel. Deci arborele binar cu n noduri de nlime
minim este arborele binar complet cu n vrfuri, care, din modul de construcie, are nlimea
log2n.
Proprietatea 5.
Definim lungimea drumurilor interne (I) ca fiind suma lungimilor drumurilor de la rdcin la
noduri neterminale (interne) i lungimea drumurilor externe (E) ca fiind suma lungimilor
drumurilor de la rdcin la noduri terminale (frunz sau externe). ntr-un arbore binar cu n
noduri interne, E I2n.
Demonstraie:
Vom proceda prin inducie dup n, numrul nodurilor interne.

P(0)

ntr-un arbore cu 0 noduri interne (vid sau format numai din rdcin) E I 0.

P(n-1) Presupunem c ntr-un arbore binar An-1, cu n-1 noduri interne, are loc relaia En-1 In12(n-1).
P(n)

Vom demonstra c ntr-un arbore binar An, cu n noduri interne, are loc relaia En In2n.

Fie An un arbore binar cu n noduri interne. Exist n An un nod intern x care are drept fii
dou noduri terminale. ndeprtnd din An fiii nodului x, nodul x se transform n nod terminal,
deci obinem un arbore An-1 cu n-1 noduri interne. Din propoziia inductiv rezult c n arborele
A n-1, En-1 In-12(n-1). Dac notm cu d, lungimea drumului de la rdcin la nodurile eliminate,
obinem relaiile :
En En-12d-(d-1) (n An nodurile eliminate sunt terminale, dar nodul x nu, lungimea drumului
de la rdcin la x fiind d-1).
In In-1(d-1) (n An nodul x este intern).
Deci En In-12(n-1)d1 In-d12n-2d1 In2n.

Reprezentarea arborilor
Reprezentarea cu referine descendente
Pentru fiecare nod din arbore vom reine informaia asociat nodului i referine ctre fiii
si. Dac presupunem c gradul oricrui nod este cel mult egal cu n, putem reprezenta referinele
spre fii printr-un vector cu n componente.
Structura unui nod va fi :
Informaie

Fiu1

Fiu2

......

Fiun

Declararea acestei structuri n seciunea type n limbajul Pascal este :


Arbore ^NodArbore;
NodArbore record
Inf: TipInformaie;
Fiu: array1..NrMaxFii of Arbore;
end;

ntr-o astfel de reprezentare risipa de memorie este foarte mare, n fiecare nod alocm
memorie pentru numrul maxim de referine ctre fii. n plus, numrul maxim de fii este, n
general, necunoscut. Acest neajuns ar putea fi eliminat folosind n locul vectorului de referine
(cu numr a priori fixat de componente) o list simplu nlnuit n care s reinem toi fiii
nodului respectiv.
Declararea acestei structuri n seciunea type n limbajul Pascal va fi :
ListaFii ^Fiu;
Fiu record
F: Arbore;
Urm: ListaFii;
end;
Arbore ^Nod Arbore;
NodArbore record
Inf: TipInformaie;
Ref: ListaFii;
end;

Reprezentarea cu referine ascendente

n aceast reprezentare, pentru fiecare nod din graf reinem pe lng informaia aferent, o
legtur spre nodul printe.
Arbore ^NodArbore;
NodArbore record
Inf: TipInformaie;
Tata: Arbore;
end;
Mai simplu, putem utiliza doi vectori n care pentru fiecare nod reinem informaia,
respectiv nodul printe. Aceast reprezentare este mai compact, dar pentru a avea acces la toate
nodurile arborelui trebuie s reinem toate nodurile terminale. O astfel de reprezentare este util
pentru reprezentarea mulimilor disjuncte cu ajutorul arborilor i o rezolvare eficient a
problemelor de reuniune a dou mulimi i de determinare a mulimii creia i aparine un
element dat.

Reprezentarea Fiu-Frate.
Pentru fiecare nod reinem fiul cel mai din stnga i fratele lui din dreapta cel mai
apropiat.
Arbore ^NodArbore;
NodArbore record
Inf: TipInformaie;
FiuSt, FrateDr: Arbore;
end;

Reprezentarea arborilor binari

. Reprezentarea nlnuit.

n aceast reprezentare, pentru fiecare nod reinem, pe lng informaia asociat nodului,
rdcina subarborelui stng, rdcina subarborelui drept i dac este necesar, printele nodului
respectiv.
ArboreBinar ^NodArboreBinar;
NodArboreBinar record
c: TipInformaie;
st, dr, printe: ArboreBinar;
end;
Arborele binar va fi referit prin intermediul rdcinii.

Reprezentarea secvenial.

Pentru fiecare nod reinem ntr-un vector doar informaia asociat nodului, legturile
dintre noduri fiind implicite. Acest tip de reprezentare este convenabil pentru arbori binari
complei. Pentru aceasta, vom numerota nodurile astfel :
- rdcina este numerotat cu 1.

- cele 2i noduri de pe nivelul i sunt numerotate 2i, 2i1, ... , 2i1-1 de la stnga la dreapta(i
> 0).
- pe ultimul nivel nodurile sunt numerotate pn la n, numrul de noduri din arbore.
Aceast numerotare ne permite s deducem legturile existente ntre nodurile arborelui.

Operaii elementare pe arbori binari

Crearea unui arbore binar.

Algoritmul de creare depinde n mod esenial de tipul arborelui binar pe care dorim s-l
construim. Vom prezenta o procedur de creare a unui arbore binar echilibrat, ali algoritmi de
creare fiind prezentai n capitolele urmtoare. Pentru a crea un arbore binar echilibrat cu n
vrfuri se stabilete un vrf rdcin, se construiete un arbore binar echilibrat cu n/2 vrfuri ca
subarbore stng i un arbore binar echilibrat cu n-1-n/2 vrfuri ca subarbore drept. Dac n este
par numrul nodurilor din subarborele stng va fi cu o unitate mai mare dect numrul nodurilor
din subarborele drept, altfel cei doi subarbori au un numr egal de noduri.
function CreareArboreBinarEchilibrat(n: byte): ArboreBinar;
// funcia ntoarce adresa rdcinii unui arbore binar echilibrat cu n //vrfuri
var rad: ArboreBinar;
begin
if n 0 then //arborele este vid
CreareArboreBinarEchilibrat : nil
else
begin
new(rad) //aloc zon de memorie pentru rdcina arborelui
readln(rad^.Inf);//citesc informaia rdcinii arborelui
// creez subarborele stng, apoi cel drept
rad^. St : CreareArboreBinarEchilibrat(n div 2);
rad^. Dr : CreareArboreBinarEchilibrat(n - n div 2 -1 );
CreareArboreBinarEchilibrat : rad
end
end;

Parcurgerea arborilor binari

Parcurgerile sunt cele mai frecvent utilizate operaii pe arbori. A parcurge un arbore
nseamn a vizita fiecare nod al arborelui o singur dat, n scopul prelucrrii informaiei
asociate nodului.
Exist mai multe posibiliti de parcurgere a arborilor- n adncime (preordine, inordine,
postordine) sau pe niveluri, dar n toate cazurile att arborele, ct i subarborii sunt prelucrai n
acelai mod.
a) Parcurgerile n adncime
n toate cele trei tipuri de parcurgere n adncime se viziteaz mai nti subarborele stng, apoi
subarborele drept. Diferena const n poziia rdcinii fa de cei doi subarbori. Fie scrise
recursiv, fie iterativ, procedurile de parcurgere n adncime necesit o stiv.
Pentru a parcurge un arbore binar n preordine, se viziteaz mai nti rdcina, se
parcurge n preordine subarborele stng, apoi se parcurge n preordine subarborele drept.
procedure Preordine(rad: ArboreBinar);
begin
if rad nil then
begin
write(rad^.inf);

//vizitez rdcina

Preordine(rad^.st); //parcurg subarborele stng


Preordine(rad^.dr); //parcurg subarborele drept
end;
end;
Pentru a parcurge n inordine un arbore binar, se parcurge n inordine subarborele stng,
se viziteaz radcina, apoi se parcurge n inordine subarborele drept.
procedure Inordine(rad: ArboreBinar);
begin
if rad nil then
begin
Inordine(rad^.st);
write(rad^.inf);
Inordine(rad^.dr);

end;
end;
Pentru a parcurge n postordine un arbore binar, se parcurge n postordine subarborele
stng, apoi cel drept, apoi se viziteaz rdcina.
procedure Postordine(rad: ArboreBinar);
begin
if rad nil then
begin
Postordine(rad^.st);
Postordine(rad^.dr);
write(rad^.inf);
end;
end;
Pentru a nelege mai bine operaia de parcurgere, vom prezenta i o variant iterativ de
parcurgere n inordine a unui arbore binar.
Pentru a simula recursia vom folosi o stiv S la care vom aduga sau terge elemente n acelai
mod ca n procedura recursiv.
Stiv ^NodStiv;
NodStiv record
Inf: ArboreBinar;
Urm: Stiv;
end;
procedure InordineIterativ (rad: ArboreBinar);
// procedura parcurge iterativ n inordine arborele cu rdcina rad
var S, p: Stiv;
NodCurent: ArboreBinar;
begin
S : nil;
NodCurent : rad;

repeat
while NodCurent nil do
begin
//adaug nodul curent n stiva S
new(p)
p^.Inf : NodCurent;
p^.Urm : S;
S : p;
//rdcina subarborelui stng devine nod curent
NodCurent : NodCurent^.St
if S nil then

//extrage un element din stiv

begin
p : S;
S : S^.Urm;
write(p^.inf)
NodCurent : p^.Inf^.Dr
dispose(p);
//elibereaz zona de memorie a lui p
until (S nil) and (NodCurent nil)
end;
Observaie
Fiecare nod din arbore este plasat i ters din stiv o singur dat, deci timpul necesar
parcurgerii inordine este de O(n). Spaiul suplimentar necesar depinde de nlimea arborelui,
deci n cazul cel mai defavorabil este de O(n).

b) Parcurgerea pe niveluri
Se viziteaz nti rdcina, apoi fiul stng al rdcinii, apoi cel drept i se continu n
acest mod vizitnd nodurile de pe fiecare nivel de la stnga la dreapta.

Pentru a realiza acest mod de parcurgere, vom utiliza o coad, pe care o iniializm cu
rdcina arborelui i din care, la fiecare pas, vom extrage un nod, l vizitm i inserm n coad
fii si, dac acetia exist.
Coad ^NodCoad;
NodCoad record
Inf: ArboreBinar;
Urm: Coad;
end;
procedure ParcurgerePeNiveluri (rad: ArboreBinar)
//procedura parcurge pe niveluri arborele cu rdcina rad
var C, SfC, p: Coad;
begin
if rad nil then //arborele este nevid
begin
new(C) // iniializez coada cu rdcina arborelui
C^.Inf : rad;
C^.Urm : nil;
SfC : C;
while C nil do // coada nu este vid
begin
p : C;
write(p^.Inf);
if p^.Inf^.St nil then
//adaug fiul stng n coad
new(q);
q^.Inf : p^.Inf^.St;
q^.Urm : nil;
SfC^.Urm : q;

begin

SfC : q;
end;
if p^.Inf^.Dr nil then
begin
//adaug fiul drept n coad
new(q);
q^.Inf : p^.Inf^.Dr;
q^.Urm : nil;
SfC^.Urm : q;
SfC : q;
end;
C : C^.Urm //extrag din coad nodul p
dispose(p);
end
end
end;
Observaie
Mai nti am inserat n coad fiii nodului ce urmeaz a fi vizitat i apoi am extras efectiv
nodul respectiv din coad, pentru a evita inserarea unui nod ntro coad vid.

Determinarea nlimii unui arbore.

Dac arborele este vid, vom considera c nlimea sa este 1, astfel putem calcula
nlimea arborelui ca fiind maximul dintre nlimile subarborilor rdcinii plus nivelul pe care
se afl rdcina.
function nlime (rad: ArboreBinar): integer;
// funcia ntoarce nlimea arborelui binar cu rdcina rad
begin
if rad nil then

// arbore vid

nlime : 1

else
nlime : max(nlime(rad^.st), nlime(rad^.dr))1
end;
Am presupus cunoscut funcia max, care ntoarce cel mai mare dintre cele dou
argumente ale sale.

Egalitatea a doi arbori binari.

Spunem c doi arbori binari snt egali dac au aceeai structur i conin aceleai
informaii n nodurile corespondente.
function Egali (rad1, rad2: ArboreBinar): boolean;
//funcia ntoarce true dac arborii cu rdcinile rad1,
// respectiv rad2 sunt egali, altfel ntoarce false
begin
Egali : (rad1 nil) and (rad2 nil)

//ambii sunt vizi sau

or (rad1 nil) and (rad2 nil) // ambii sunt nevizi i


and (rad1^.c rad2^.c) //au aceeai informaie n rdcin
and Egali(rad1^.St, rad2^.St) //subarborii stngi egali
and Egali(rad1^.Dr, rad2^.Dr) // subarborii drepi egali
end;

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