You are on page 1of 21

Arbori Binari

Noiuni generale
Se numete Arbore cu rdcin = graf neorientat conex fr cicluri n care unul din noduri este
desemnat ca rdcin. Nodurile pot fi aezate pe niveluri ncepnd cu rdcina care este
plasat pe nivelul 1.
Rdcin = Nod special care genereaz aezarea unui arbore pe niveluri; Aceast operaie se
efectueaz n funcie de lungimea lanurilor prin care celelalte noduri sunt legate de rdcin.
Descendent = ntr-un arbore cu rdcin nodul y este descendentul nodului x dac este situat
pe un nivel mai mare dect nivelul lui x i exist un lan care le unete i nu trece prin rdcin.
Descendent direct / fiu = ntr-un arbore cu rdcin nodul y este fiul (descendentul direct)
nodului x dac este situat pe nivelul imediat urmtor nivelului lui x i exist muchie ntre x i y.
Ascendent = ntr-un arbore cu rdcin nodul x este ascendentul nodului y dac este situat pe
un nivel mai mic dect nivelul lui y i exist un lan care le unete i nu trece prin rdcin.
Ascendent direct / printe = ntr-un arbore cu rdcin nodul x este printele (ascendentul
direct) nodului y dac este situat pe nivelul imediat superior (cu numr de ordine mai mic)
nivelului lui y i exist muchie ntre x i y.
Frai = ntr-un arbore cu rdcin nodul x este fratele nodului y dac au acelai printe.
Frunz = ntr-un arbore cu rdcin nodul x este frunz dac nu are nici un descendent direct

Exemplu
- Nodul 1 este rdcin.
- Nodurile 5, 6, 7 sunt fii nodului 3.
- Nodul 7 este printele nodurilor 9 i 10;
- Nodul 9 este descendentul lui 3
- Nodul 3 este ascendentul lui 10
- Nodurile 8, 9 i 10 sunt frunze
- Nodurile 5, 6 i 7 sunt frai.

Arborii binari sunt un tip aparte de arbori, n care fiecare nod are
maxim 2 copii. Pentru un nod dat, ntr-un arbore binar, vom avea
copilul din stnga, i copilul din dreapta. Exemplu:

Arborele din figura a are 8 noduri, nodul 1 fiind rdcina. Acesta are
ca i copil stnga nodul nr.2, iar ca i copil dreapta nodul nr.3. La
rndul su nodul nr.2 are dect un copil(stnga), i anume nodul nr.4.
Deci un nod dintr-un arbore binar poate avea 2 copii (st i dr), un
singur copil (doar st sau doar dr) sau nici unul (exemplu nodul 8).
Nodurile care nu au nici un copil se numesc noduri frunz.
Nodurile care au 1 sau 2 copii se numesc noduri interne.

Pentru reinerea informaiei n calculator se pot folosi 2 metode, static


(vectori) sau dinamic.
Deoarece pentru fiecare nod n parte este necesar s se rein, pe lng
informaia util i legturile cu nodurile copii (adresele acestora).
Urmtoarea ar fi structura unui nod:
type Arbore=^Nod;
Nod=record
Info: string;
St,Dr: Arbore
end;
var T: Arbore; {rdcina}

n figura 1 este reprezentat un arbore binar n care rdcina este 1 (s-a


renunat la orientarea arcelor, care sunt implicite deoarece se cunoate
rdcina).
Observaii:
Nodurile sunt aezate pe mai multe niveluri
Rdcina este pe nivelul 0
Adncimea arborelui este egal cu numrul de niveluri-1. Arborele
din figura 1 are 4 niveluri: nivel 0, nivel 1, nivel 2, nivel 3 i adncimea
3
Se face distincie ntre descendentul stng i cel drept

Pentru arborele din figura 1 cei doi vectori rein:


Vectorul stng:
2

Vectorul drept:
3

Crearea unui arbore binar (recursiv)

function Arb_Creare: Arbore;


{crearea arborelui binar}
var R: Arbore;
s: string;
begin
readln(s);
if s='' then Arb_Creare:=nil
else begin
new(R);
R^.Info:=s;
writeln('Dati descendentul stang al nodului
',s,':');
R^.St:=Arb_Creare;
writeln('Dati descendentul drept al nodului
',s,':');
R^.Dr:=Arb_Creare;
Arb_Creare:=R;
end;
end; {Arb_Creare}

Afiarea unui arbore binar (recursiv)


procedure Arb_Afis(T: Arbore; nivel: integer);
{afisarea arborelui binar}
var i: integer;
begin
if T<>nil then begin
Arb_Afis(T^.St, nivel+1);
for i:=1 to nivel do
write('
');
writeln(T^.Info);
Arb_Afis(T^.Dr, nivel+1);
end;
end; {Arb_Afis}

Crearea
i
afiarea
unui
arbore
binar
(recursiv)
Program P130;
end;
{Crearea unui arbore binar recursie}
type Arbore=^Nod;
Nod=record
Info: string;
St,Dr: Arbore
end;
var T : Arbore; {radacina}
function Arb_Creare: Arbore;
{crearea arborelui binar}
var R: Arbore;
s: string;
begin
readln(s);
if s='' then Arb_Creare:=nil
else begin
new(R);
R^.Info:=s;
writeln('Dati descendentul
stang al nodului ',s,':');
R^.St:=Arb_Creare;
writeln('Dati descendentul
drept al nodului ',s,':');
R^.Dr:=Arb_Creare;
Arb_Creare:=R;

end; {Arb_Creare}
procedure Arb_Afis(T: Arbore;
nivel: integer);
{afisarea arborelui binar}
var i: integer;
begin
if T<>nil then begin
Arb_Afis(T^.St, nivel+1);
for i:=1 to nivel do
write('
');
writeln(T^.Info);
Arb_Afis(T^.Dr, nivel+1);
end;
end; {Arb_Afis}
begin
writeln('Dati radacina:');
T:=Arb_Creare;
Arb_Afis(T, 0);
readln;
end.
Funcia Arb_Creare citete de la
tastatur informaia util, dac se
introduce un ir vid nu se creeaz nci
un nod.

Dati radacina:
1
Dati descendentul stang al
nodului 1:
2
Dati descendentul stang al
nodului 2:
4
Dati descendentul stang al
nodului 4:

Dati descendentul drept al


nodului 4:
Dati descendentul drept al
nodului 2:
5
Dati descendentul stang al
nodului 5:

Dati descendentul drept al


nodului 5:
Dati descendentul drept al
nodului 1:
3

Dati descendentul stang al


nodului 3:
6
Dati descendentul stang al
nodului 6:

Dati descendentul drept al


nodului 6:
Dati descendentul drept al
nodului 3:
7
Dati descendentul stang al
nodului 7:

Dati descendentul drept al


nodului 7:
2
1
3

5
6
7

Parcurgerea arborilor binari


1. Parcurgerea n inordine (stnga rdcina dreapta SRD) se parcurge
mai nti subarborele stng, apoi rdcina, apoi subarborele drept.
2. Parcurgerea n preordine (rdcina stnga dreapta RSD) se parcurge
mai nti rdcina, apoi subarborele stng, apoi subarborele drept.
3. Parcurgerea n postordine (stnga dreapta rdcina SDR) se parcurge
mai nti subarborele stng, apoi subarborele drept i la sfrit rdcina.

Exemplu
parcurgere svd - n inordine
42516378
parcurgere vsd - n preordine
12453678
parcurgere sdv - n postordine
45268731

Parcurgere RSD (preordine)


procedure RSD(T: Arbore);
{traversare RSD}
begin
if T<>nil then begin
writeln(T^.Info);
RSD(T^.St);
RSD(T^.Dr)
end;
end; {RSD}

Parcurgere SRD (inordine)


procedure SRD(T: Arbore);
{traversare Inordine}
begin
if T<>nil then begin
SRD(T^.St);
writeln(T^.Info);
SRD(T^.Dr)
end;
end; {SRD}

Parcurgere SDR (postordine)


procedure SDR(T: Arbore);
{traversare Postordine}
begin
if T<>nil then begin
Postordine(T^.Stg);
Postordine(T^.Dr);
writeln(T^.Info)
end;
end; {SDR}

Program P131;
',s,':');
{Parcurgerea arborelui binar}
R^.Dr:=Arb_Creare;
type Arbore=^Nod;
Arb_Creare:=R;
Nod=record
end;
Info: string;
end; {Arb_Creare}
St,Dr: Arbore
procedure Arb_Afis(T: Arbore;
end;
nivel: integer);
var T : Arbore; {radacina}
{afisarea arborelui binar}
function Arb_Creare: Arbore; var i: integer;
{crearea arborelui binar}
begin
var R: Arbore;
if T<>nil then begin
s: string;
Arb_Afis(T^.St,
begin
nivel+1);
readln(s);
for i:=1 to nivel do
if s='' then Arb_Creare:=nil
write('
');
else begin
writeln(T^.Info);
new(R);
Arb_Afis(T^.Dr,
R^.Info:=s;
nivel+1);
writeln('Dati
end;
descendentul stang al nodului end; {Arb_Afis}
',s,':');
R^.St:=Arb_Creare;
writeln('Dati
descendentul drept al nodului

procedure RSD(T: Arbore);


{parcurgere Preordine}
begin
if T<>nil then begin
writeln(T^.Info);
RSD(T^.St);
RSD(T^.Dr)
end;
end; {RSD}
procedure SRD(T: Arbore);
{parcurgere Inordine}
begin
if T<>nil then begin
SRD(T^.St);
writeln(T^.Info);
SRD(T^.Dr)
end;
end; {SRD}
procedure SDR(T: Arbore);
{parcurgere Postordine}
begin
if T<>nil then begin
SDR(T^.St);
SDR(T^.Dr);

writeln(T^.Info)
end;
end; {SDR}
begin
writeln('Dati radacina:');
T:=Arb_Creare;
Arb_Afis(T, 0);
readln;
writeln('Parcurgere in
preordine:');
RSD(T);
readln;
writeln('Parcurgere in
inordine:');
SRD(T);
readln;
writeln('Parcurgere in
postordine:');
SDR(T);
end.

Dati radacina:
1
Dati descendentul drept al nodului 8:
Dati descendentul stang al nodului 1:
2
4
Dati descendentul stang al nodului 2: 2
4
5
Dati descendentul stang al nodului 4: 1
6
Dati descendentul drept al nodului 4: 3
7
Dati descendentul drept al nodului 2:
8
5
Dati descendentul stang al nodului 5: Parcurgere in preordine:
1
Dati descendentul drept al nodului 5: 2
4
Dati descendentul drept al nodului 1: 5
3
3
Dati descendentul stang al nodului 3: 6
6
7
Dati descendentul stang al nodului 6: 8
Dati descendentul drept al nodului 6: Parcurgere in inordine:
4
Dati descendentul drept al nodului 3: 2
7
5
Dati descendentul stang al nodului 7: 1
6
Dati descendentul drept al nodului 7: 3
8
7
Dati descendentul stang al nodului 8: 8

Parcurgere in postordine:
4
5
2
6
8
7
3
1

1. Elaborai un program care construiete arborele genealogic propriu a 3 sau 4


generaii. Nodul-rdcin conine numele, penumele i anul naterii, iar
nodurile descendente conin datele despre prini.
2. Elaborai o procedur recursiv care parcurge un arbore binar n ordinea:
RDS (rdcin subarborele drept subarborele stng)
DRS (subarborele drept rdcin subarborele stng)
DSR (subarborele drept subarborele stng rdcin)