Documente Academic
Documente Profesional
Documente Cultură
Rădăcina arborelui:
A nivelul 0
B C ----------------------------- nivelul 1
Înălţime=3
D E F G H ------------------ nivelul 2
I J K ------------- nivelul 3
Într-o structură de tip arbore elementele sunt sructurate pe nivele; pe primul nivel, numit nivel
0, există un singur element numit rădăcină, de care sunt legate mai multe elemente numite fii (sau
descendenţi direcţi), care formează nivelul 1; de acestea sunt legate elementele de nivelul 2 şi a.m.d.
Există un drum unic de la rădăcina arborelui la fiecare nod x din arbore. Dacă y se găseşte pe
drumul unic de la rădăcină la x, atunci y se numeşte ascendent (strămoş) al lui x.
Un nod pe un anumit nivel este nod părinte pentru nodurile legate de el, situate pe nivelul
următor, acestea reprezentând fii săi. Nodurile care au acelaşi părinte se numesc noduri fraţi. Fiecare
nod are un singur părinte, cu excepţia rădăcinii, care nu are părinte. Nodurile fără fii se numesc
noduri terminale (sau frunze). Termenii nod părinte, nod fiu sau frate sunt preluaţi de la arborii
genealogici, cu care arborii în studiu se aseamănă foarte mult.
Nivelul maxim din arbore se numeşte înălţimea (adâncimea) arborelui.
Arborii, ca structură dinamică de date, au extrem de multe aplicaţii (căutări, sortări, etc.), unde
se poate obţine economie de timp şi memorie, o minimizare a numărului de operaţii, ajungându-se la
algoritmi eficienţi, şi, implicit, la programe performante. Deosebit de utilizată în aplicaţii este structura
de tip arbore binar.
Un arbore binar este un arbore în care fiecare nod are cel mult doi fii, fiul stâng şi fiul drept
(fiul stâng este legat în stânga părintelui şi cel drept în dreapta).
Exemplu de arbore binar:
Dacă în această figură se elimină rădăcina
1 şi legăturile ei, se obţin doi arbori binari
care se numesc subarborii stâng şi drept ai
Fiul stâng arborelui iniţial. Deci, arborele binar este o
al nodului 1--- 2 3 -----Fiul drept structură recursivă de date.
al nodului 1 Un arbore binar nevid fie se reduce la
rădăcină, fie cuprinde rădăcina şi cel mult
doi subarbori binari.
4 5 6
7 8
Disciplina: Programarea calculatorului Profesor:Gribineț L.
Pentru reţinerea informaţiei în calculator se va folosi alocarea dinamică. Deoarece pentru fiecare
nod în parte este necesar să se reţină, pe lângă informaţia utilă şi legăturile cu nodurile fii (adresele
acestora), ne putem imagina următoarea structură a unui nod:
st inf dr
Absenţa unui fiu se va marca cu pointerul NULL. Implementarea arborelui de mai sus este
prezentată în următoarea figură:
1 Rădăcina
2 NULL 3
Din multitudinea operaţiilor care se pot efectua asupra unui arbore binar vom menţiona
următoarele:
1) parcurgerea (traversarea) arborelui;
2) crearea arborelui;
3) căutarea (localizarea) unui nod;
4) inserarea unui nod;
5) ştergerea unui nod.
2) În inordine (SRD): se vizitează în inordine nodurile subarborelui stâng, apoi rădăcina, şi apoi
tot în inordine, nodurile subarborelui drept.
Exemplu (parcurgerea în inordine a arborelui din paragraful precedent): 4, 7, 2, 1, 5, 3, 8, 6.
3) În postordine (SDR): se vizitează în postordine nodurile subarborelui stâng, apoi tot în
postordine, nodurile subarborelui drept şi, la sfârşit rădăcina.
Exemplu (parcurgerea în postordine a arborelui din paragraful precedent):7, 4, 2, 5, 8, 6, 3, 1.
b. Parcurgerea pe niveluri –se vizitează întâi rădăcina, apoi fiul stâng al rădăcinii, apoi cel
drept şi se continuă în acest mod, vizitând nodurile de pe fiecare nivel de la stânga la dreapta. Pentru
arborele prezentat în paragraful precedent, şirul parcurgerii pe niveluri este:1 2 3 4 5 6 7 8.
În continuare scriem 4 funcţii recursive destinate realizării celor trei metode de parcurgere în
adâncime şi creării unui arbore binar. Fie r este o variabilă de tip referinţă care indică rădăcina
arborelui.
void RSD(ARB *r) //Parcurgere preordine void SRD(ARB *r) //Parcurgere inordine
{ {
if(r) if(r)
{ {
cout<<r->inf<<" "; RSD(r->st); RSD(r->dr); SRD(r->st); cout<<r->inf<<" "; SRD(r->dr);
} }
} }
void SDR(ARB *r) //Parcurgere postordine void Creare(ARB* &r) //Creare arbore binar
{ { int x; // x-informatie pentru subarbore
if(r) cin>>x;
{ if(!x) //urmeaza subarbore vid
SDR(r->st); SDR(r->dr); cout<<r->inf<<" "; r=0;
} else //Creare nod curent şi memorare informaţie
} { r=new ARB; r->inf=x;
Creare(r->st); Creare(r->dr); } //Autoapelări
}
Programul următor realizează crearea unui arbore binar şi afişează listele nodurilor obţinute prin cele
trei metode de parcurgere în adâncime.
Disciplina: Programarea calculatorului Profesor:Gribineț L.
#include<iostream>
using namespace std;
typedef struct nod //Definirea tipului ARB
{ int inf;
nod *st,*dr;
} ARB;
int main()
{ ARB *rad; //adresa radacinii arborelui
cout<<"Introduceti nodurile : ";
Creare(rad); //crearea arborelui binar
cout<<"\nNodurile in preordine: "; RSD(rad);
cout<<"\nNodurile in inordine: "; SRD(rad);
cout<<"\nNodurile in postordine: "; SDR(rad);
cout<<"\n";
Sterge(rad); //Stergerea arborelui din heap
return 0;
}
Disciplina: Programarea calculatorului Profesor:Gribineț L.
1 10
1 5 7 9
2 8
4
4
(a) (b)
5 25
20 75
5 25
20 75 62
5 25
5 25 62
În prezenţa declaraţiilor:
typedef struct nod
{ int inf; nod *st,*dr;
} ABC;
următoarea funcţie realizează adăugarea unui nod într-un ABC după metoda descrisă mai sus:
`
A1 A1
b. Nodul p are un singur fiu. Înlocuim legătura spre p cu o legătură spre unicul fiu al lui p.
t t
p
A2
`
A1 A2 A1
c. Nodul p are exact doi fii. Vom reduce acest caz la una dintre situaţiile a. sau b., conservând
proprietatea de arbore binar de căutare. Pentru aceasta vom determina nodul cu cea mai mare cheie din
subarborele stâng al lui p, notat max.
Vom înlocui cheia lui p cu cheia nodului max şi vom şterge nodul max, care nu are fiu drept.
Deoarece nodul max este situat în subarborele stâng al lui p, are cheia mai mică decât nodurile din
subarborele drept şi mai mare decât a nodurilor din subarborele stâng, deci arborele astfel obţinut este
arbore binar de căutare.
Se poate proceda în mod analog, păstrând consistenţa arborelui binar de căutare înlocuind cheia lui
p cu cheia nodului cu cea mai mică cheie din subarborele drept al lui p, notat min, nod care nu are fiu
stâng şi ştergând apoi nodul min.
Exemplu. Să ştergem, din arborele binar de căutare următor, nodul cu valoarea 18.
25
Acest nod are doi fii. Vom determina maximul din
18 50 subarborele stâng al nodului cu valoarea 18 (nodul
cu valoarea 12), înlocuim cheia 18 cu cheia 12, apoi
12 20 46 99
ştergem maximul din subarborele stâng (acest nod
7 19 22 49 nu are fiu drept ). Obţinem arborele:
Disciplina: Programarea calculatorului Profesor:Gribineț L.
25
Programul următor gestionează operaţiile de creare şi
12 50 prelucrare a unui ABC. Se crează un arbore iniţial din
n valori citite de la tastatură. Prin intermediul unor
7 20 46 99 opţiuni de meniu se poate realiza în mod repetat
adăugarea unui nod în ABC, căutarea unei valori x,
ştergerea unei valori x şi afişarea nodurilor din arbore în
19 22 49
inordine (ordonate crescător după chei):
include <iostream>
using namespace std;
}
if(!p) return; // cheia x nu se afla I arbore
if(p->st && p->dr) //nodul de sters are 2 fii
{ // determin maximumul din subarborele stang
tmax=p; max=p->st;
while (max->dr)
{ tmax=max; max=max->dr;}
//copiez informatia
p->inf=max->inf;
//nodul maxim devine nod de sters
t=tmax; p=max;
}
//noduri de sters are cel mult un fiu
if(p->st) fiu=p->st;
else fiu=p->dr;
if (t)
if(t->st==p) //p este un fiu sters al parintelui sau
t->st=fiu;
else //p este fiul drept al tatalui sau
t->dr=fiu;
else //sterg radacina arborelui
r=fiu;
delete p;
}
void SRD(ABC *r) // Parcurgerea ABC în inordine
{ if(r)
{ SRD(r->st); cout<<r->inf<<" "; SRD(r->dr); }
}
int main()
{ ABC *rad=0; int x,opt;
Creare(rad); //se creaza ABC-ul initial
do{
cout<<"\n\n\tOptiuni:\n 1-Cauta o valoare in ABC\n 2-Adauga un nod in
ABC\n";
cout<<" 3-Sterge un nod din ABC\n 4-Lista nodurilor in inordine\n 5-Iesire\n";
cout<<"optiunea: "; cin>>opt;
switch(opt)
{ case 1: {cout<<"valoarea: "; cin>>x;
Cauta(rad,x); break;}
case 2: {cout<<"valoarea: "; cin>>x;
Adauga(rad,x); break;}
case 3: {cout<<"valoarea: "; cin>>x;
Stergere(rad,x); break;}
case 4: SRD(rad);
}
}while(opt!=5);
}