Documente Academic
Documente Profesional
Documente Cultură
Arbori Binari
Arbori Binari
DISCIPLINA:Informatica
TITLUL REFERATULUI:Arbori
binari
P(k)
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
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;
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 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.
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;
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
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
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.
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.
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)