Sunteți pe pagina 1din 5

ARBORI CU RADACINA

DEFINITIE, PROPRIETATI, REPREZENTARE


Def:
Un graf conex si fara cicluri se numeste arbore.
Teorema:
Fie un graf G=(X,U). Urmatoarele afirmatii sunt echivalente:
1) G este arbore.
2) G este un graf conex, minimal in raport cu aceasta proprietate (eliminand o muchie oarecare, se obtine un graf
ne-conex).
3) G este un graf fara cicluri, maximal, in raport cu aceasta proprietate (adaugand o muchie oarecare, se obtine un
graf care are cel putin un ciclu).
Teorema:
Un arbore cu n varfuri are n-1 muchii.
Def:
- Un arbore cu proprietatea ca fiecare nod, cu exceptia frunzelor, are cel mult doi descendenti (succesori) se
numeste arbore binar.
- Un arbore cu proprietatea ca fiecare nod, cu exceptia frunzelor, are exact doi descendenti (succesori) se numeste
arbore binar complet.
Definirea unui nod se face astfel:
type pnod=^nod
nod=record
info: integer
st, dr: pnod;
end;

{1}
{2}
{3}
{4}
ALGORITMI DE PARCURGERE A UNUI ARBORE BINAR

Prin parcurgerea unui arbore binar, se intelege vizitarea tuturor nodurilor, pe rand, intr-o anumita ordine. Un
arbore binary poate fi privit ca un ansamblu de trei entitati: radacina, un subarbore stang al radacinii si un
subarbore drept al radacinii.
Exista 3 algoritmi de parcurgere. Deosebirea intre ei consta in care sunt 'explorate' entitatile rezultate din
descompunere (radacina, subarborele stang subarborele drept). In ilustrarea acestor algoritmi, vom nota cu SA(x1,
x2..., xp), subarborele alcatuit din nodurile x1, x2..., xp.
1

Ex:

2
5
4

- radacina este nodul 1


- subarborele stang al radacinii 1 este un arbore alcatuit
din nodurile 2 si 4
- subarborele drept al radacinii 1 este un arbore alcatuit
din nodurile 3, 5, 6, 7, 8
- la randul lor fiecare subarbore poate fi descompus dupa
acelasi model

Algoritmul RSD
( radacina - subarbore stang - subarbore drept, sau parcurgerea in preordine)
Se viziteaza mai intai radacina, apoi arborele stang al radacinii, si in final subarborele drept al radacinii.
procedure RSD (p:pnod);
begin
if p<>NIL then
begin
write(p^.info, );
RSD(p^.st);
RSD(p^.dr);
end;
end;

Pentru exemplul de mai sus :


- 1, SA(2,4), SA(3, 5, 6, 7, 8)
- 1, 2, -, 4, 3, 5, SA (6, 7, 8)
- 1, 2, 4, 3, 5, 6, 7, 8

Algoritmul SRD
(subarbore stang radacina - subarbore drept sau parcurgerea in inordine)
Se viziteaza mai intai subarborele stang al radacinii, apoi radacina, si in final subarborele drept al radacinii.
procedure SRD (p:PNOD)
begin
if p<>NIL then
begin
SRD(p^.st);
write(p^.info, );
SRD(p^.dr);
end;
end;

Pentru exemplul de mai sus :


- SA(2, 4), 1, SA(3,5, 6,7, 8)
- --, 2, 4, 1, 5, 3, SA(6, 7,8)
- 2, 4, 1, 5, 3, 7, 6, 8

Algoritmul SDR
(subarbore stang-subarbore drept radacina sau parcurgerea in postordine)
Se viziteaza mai intai subarborele stang al radacinii, apoi subarborele drept, si in final radacina.
procedure SDR (p:PNOD);
begin
if p<>NIL then
begin
SDR(p^.st);
SDR(p^.dr);
write(p^.info, );
end;
end;

Pentru exemplul de mai sus :


- SA(2, 4), SA(3,5, 6,7, 8), 1
- --, 4, 2, 5, SA(6, 7, 8), 3, 1
- 4, 2, 5, 7, 8, 6, 3, 1

CREAREA ARBORILOR BINARI


- se va scrie o procedura recursiva care in timpul unei executii creaza un nod al arborelui
- procedura se va numi: creare (var p:pnod);
- in p, care este parametru transmis prin referinta, se va memora pointerul catre nodul creat
procedure creare (var p:pnod);
var x:integer;
begin
write(x=); readln(x);
if x=0 then
p:=nil
else
begin
new(p);
p^.info:= x;
writeln (succesorul stang al noduluicu info, x);
creare(p^.st);
writeln (succesorul drept al noduluicu info, x);
creare(p^.dr);
end;
end;
- exemplu de program:
program arbore_binar;
type pnod=^nod;
nod=record
info:integer;
st, dr:pnod;
end;
var r:pnod;
procedure RSD(p:pnod);
begin
-----------------end;
procedure creare (p:pnod);
var x:integer;
begin
------------end;
end;
begin
r:=nil;
creare(r);
RSD(r);
end.
3

ARBORE BINAR DE CAUTARE


- vom vorbi de arborii binari in care fiecare nod contine ca informatie utila un numar intreg
- un arbore binar de cautare este un arbore binar cu proprietatea ca, pentru fiecare nod, cheia din succesorul sau
stang este mai mica decat cheia din nod, iar cheia din succesorul sau drept este mai mare decat cheia din nod
- parcurgerea unui arbore binar de cautare se realizeaza tot cu algoritmii deja invatati: RSD (preordine), SDR
(postordine), SRD (inordine);
- parcurgand in inordine un arbore binar de cautare avand drept chei numere intregi, vom obtine cheile in ordine
crescatoare
- cheile unui arbore binar de cautare sunt distincte
- pentru orice nod, toate cheile din subarborele stang al nodului sunt mai mici decat cheia din nodul respectiv, si
toate cheile din subarborele drept sunt mai mari decat cheia din nodul respectiv
- cheia maxima se afla in nodul cel mai din dreapta si cheia minima dintr-un arbore binar de cautare se gaseste in
nodul cel mai din stanga (la care se ajunge avansand succesiv cu un pointer numai pe legaturi de tipul succesor
stang, pornind de la radacina)
CREAREA UNUI ARBORE DE CAUTARE
- se creaza procedura recursiva creare_nod (var q:pnod; x:integer);
- ea se va apela intr-un ciclu in care se adauga pe rand nodurile din arbore
- la fiecare apel se insereaza nodul cu informatia x ca frunza in arborele creat pana in acel moment
- parametrul q reprezinta pointerul catre radacina arborelui deja creat
- in mod recursiv, se cauta locul pe care il va ocupa noul nod in arbore; el va fi nod-frunza, dar trebuie stabilit al cui
succesor va fi, si ce fel de succesor (stang sau drept)
- in timpul cautarii pointerul q va avansa in adancimea arborelui
- la fiecare pas el va referi radacina unui alt subarbore, pana cand la un moment dat ajunge la NIL
- daca q este diferit de NIL, trebuie comparata valoarea lui x cu cheia din radacina adresata de q
- daca x<q^.info nodul cu cheia x se va gasi in subarborele stang al radacinii
- daca x>q^.info nodul cu cheia x se va gasi in subarborele drept al radacinii
- daca se intalneste un nod a carui informatie q^.info este egala cu x asta inseamna ca nodul cu cheia x exista deja
si deci nu mai poate fi introdus
procedure creare_nod (var q:pnod; x:integer);
var nou:pnod;
begin
if q<> NIL then
begin
if x< q^.info then
creare_nod(q^.st, x)
else
if x> q^.info then
creare_nod (q^.dr, x)
else
writeln (`Nodul exista deja);
end
else
begin
new(q);
q^.info:=x;
q^.st:=NIL;
q^.dr:=NIL;
end; end;
4

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