You are on page 1of 16

Arbori binari

– crearea arborilor binari


– parcurgerea arborilor binari
– modificarea structurii arborilor binari
Noțiuni
• Arborii sunt structuri de date de natură recursivă și dinamică
• Prin arbore înțelegem o mulțime finită și nevidă de elemente numite noduri, care
satisfac proprietățile:
 Există un nod și numai unul singur care se numește rădăcina arborelui;
 Celelalte două noduri formează submulțimi distincte ale mulțimii de noduri, care formează
la rândul lor câte un arbore (arborii respectivi se numesc subarbori ai rădăcinii);
• Într-un arbore fiecare nod (exceptând rădăcina) are un părinte (predecesor sau
tată), fiecare nod are 0 sau mai mulţi subarbori nevizi, ai căror rădăcini sunt fii
(succesori) ai nodului rădăcină, există noduri cărora nu le mai corespund subarbori,
un astfel de nod se numește nod terminal (frunză)
• Nivel: rădăcina unui arbore are nivelul 0, părintele ce urmează are nivelul 1. Dacă
un nod are nivelul i, atunci descendenții lui au nivelul i+1.
Noțiuni
• Un arbore binar este o mulțime finită de elemente care
este vidă sau conține un element (rădăcina), iar celelalte
elemente se împart în două submulțimi disjuncte, care
fiecare la rândul ei este un arbore binar.
• Una din submulțimi se numește subarborele stâng al
rădăcinii, iar celălaltă - subarborele drept.
• Arborele binar este ordonat, deoarece în fiecare nod,
subarborele stâng se consideră că precedă subarborele
drept.
• Un nod al uni arbore binar are cel mult doi fii(descendenți)
numiși fiul stâng și fiul drept.
Proprietăți
• Există cel mult 2i noduri pe nivelul i al arborelui
 Pe nivelul 0 se află un nod rădăcină (20), pe nivelul 1 cel mult 2(două) noduri (21),
pe nivelul 2 cel mul 4 noduri (22) ș.a.m.d

 Un arbore binar de înălțimea h are cel mult 2h noduri pe ultimul nivel. Ultimul nivel
este h.

 Un arbore binar cu înălțimea h are cel mult 2h+1 -1

 Dacă a este numărul nodurilor terminale și c este numărul nodurilor care au exact 2
descendenți atunci a=c+1
Modalități de reprezentare
• Arborii binari se reprezintă prin referințe descendente. Astfel, pentru fiecare nod
trebuie să se cunoască nodul care constituie vârful subarborelui stâng și nodul care
reprezintă vârful subarborelui drept.
1. Reprezentarea cu ajutorul vectorului:
Un arbore binar poate fi reprezentat cu ajutorul a doivectori: st (de la stânga) și dr (de la
dreapta)
Pentru fiecare nod i dintre cele n, st[i] reține numărul de ordine al nodului stâng subordonat
de i, ar dr[i] reține numărul de ordine al nodului drept subordonat de i. Dacă nu există nod
subordonat atunci se reține 0.
1 2 3 4 5 6
1
st 2 4 0 0 0 0
2 3
dr 3 5 6 0 0 0
4 5 6
Modalități de reprezentare
• 2. Reprezentarea în HEAP:
• Fiecare nod al arborelui este reprezentat în HEAP de o înregistrare cu următoarea
structură:
type arbore=^Nod; 1
Nod=record
nr: integer;
2 nil 3
stg,drt : arbore;
end;
nil 4 nil nil 5 nil nil 6 nil
Modalități de parcurgere
• Parcurgerea în adâncime:
 Parcurgere în inordine (SVD) – se parcurge mai întâi subarborele stâng, apoi vârful, apoi
subarborele drept.
 Parcurgerea în preordine (VSD) – se parcurge mai întâi vârful, apoi subarborele stâng, apoi
subarborele drept.
 Parcurgere în postordine (SDV) – se parcurge mai întâi subarborele stâng, apoi subarborele
drept, apoi vârful.

SVD: 4 2 5 1 3 6 1

VSD: 1 2 4 5 3 6 2 3

4 5 6
SDV: 4 5 2 6 3 1
Modalități de parcurgere
• Parcurgerea în lățime :
 Se vizitează întâi vârful, apoi subarborele stâng al vârfului, apoi cel drept şi se continuă în
acest mod vizitând nodurile de pe fiecare nivel de la stânga la dreapta.

1
123456
2 3

4 5 6
Operații
• Inserarea unui nod frunză:
1. Se alocă zona de memorie pentru nodul temporal ce urmează să se insereze în arbore.
2. Se atribuie valori variabilelor ce formează acest nod
3. Se atribuie valoarea NIL adreselor pentru noul nod creat
4. Unde se înserează nodul?
Dacă arborele este vid, atunci acest nod va fi primul nod al arborelui și facem legătura. Procesul se
oprește. În caz contrar, se determină poziția în care trebuie inserat noul nod. Presupunem că această
adresă este menținută de o variabilă nod. De asemenea, criteriul folosit mai sus va indica dacă
inserarea se va face în nodul stâng sau în nodul drept al nodului, sau operația nu poate fi efectuată. În
caz că inserarea nu poate fi efectuată, atunci eliberăm zona de memorie a cărei adresă se află în
variabila temporală și procesul se termină;

5. Dacă inserarea se face în nodul stâng, atunci se face atribuirea și procesul se termină
6. Dacă inserarea se face în nodul drept, atunci se face atribuirea și procesul se termină
Operații (continuare)
 Accsul la un nod
Presupune existența unui criteriu care săpermită determinarea nodului respectiv (descris la
p.4)
 Parcurgerea
SVD, VSD, SDV
 Ștergerea
 Este necesarăparcurgerea lui și ștergerea fiecărui nod. Arborele va fi parcurs in postordine
(SDV) deoarece rădăcina arborelui trebuie ștearsă ultima.
Programul ArbRec ilustreaza cele trei moduri de parcurgere prezentate (procedurile VSD, SVD,
SDV) precum si generarea unui arbore (procedura Gener_Arb), aflarea înaltimii unui arbore
(procedura Inaltime) si aflarea numarului de noduri dintr-un arbore (procedura NumarNod).

procedure Gener_Arb(var p:pstruct);


Program ArbRec;
begin
type
...write('x=');readln(x);
...pstruct=^struct;
...if x<>0 then
...struct=record
...begin
...util:integer;
......new(p);
...st,dr:pstruct
......p^.util:=x;
end;
......Gener_Arb(p^.st);
var
......Gener_Arb(p^.dr)
...rad,p:pstruct;
...end
...ch:char;
...else
...x,m:integer;
......p:=nil
end;
procedure VSD(p:pstruct);
{preordine}
begin
...if p<>nil then
...begin
......write(p^.util:2);
......VSD(p^.st); procedure SVD(p:pstruct);
......VSD(p^.dr) {inordine}
...end begin
end; ...if p<>nil then
...begin
......SVD(p^.st);
......write(p^.util:2);
......SVD(p^.dr) procedure SDV(p:pstruct);
...end {postordine}
end; begin
...if p<>nil then
...begin
......SDV(p^.st);
......SDV(p^.dr);
......write(p^.util:2)
...end
end;
function NumarNod(p:pstruct):byte;
begin
...if p=nil then
......NumarNod:=0
...else
......NumarNod:=1+NumarNod(p^.st)+
NumarNod(p^.dr)
end; function Inaltime(p:pstruct):byte;
var
...ist,idr:byte;
begin
...if p=nil then
......Inaltime:=0
...else
...begin
......ist:=Inaltime(p^.st);
......idr:=Inaltime(p^.dr);
......if ist > idr then
.........Inaltime:=ist+1
......else
.........Inaltime:=idr+1
...end
end;
begin {program principal}
...repeat
......writeln('G.Generare arbore binar');
......writeln('1.Parcurgere in preordine
(RSD)');
......writeln('2.Parcurgere in inordine
(SRD)');
......writeln('3.Parcurgere in
...case upcase(ch) of
postordine(SDR)');
......'G':Gener_Arb(rad);
......writeln('4.Numar noduri arbore');
......'1':RSD(rad);
......writeln('5.Inaltime arbore');
......'2':SRD(rad);
......writeln('S.Sfirsit program');
......'3':SDR(rad);
......write('Optiunea dvs. va
......'4':begin
rog:');readln(ch);
.........m:=NumarNod(rad);
writeln('Arborele are ',m,' noduri')
.........end;
......'5':begin
.........m:=Inaltime(rad);
writeln('Arborele are inaltimea ',m)
.........end
......end;
......readln
...until ch in ['s','S']
end {ArbRec}.