You are on page 1of 4

Inca 3 cursuri, si dupa aceea incepem cu grilele

Arbori
Acesti arbori sunt tot structuri dinamice de date, dar fiecare nod (element) contin informatii si
despre alt nod. Aceste alte noduri vor fi numiti descendenti. Care pot fi mai multi sau mai putini.
Intr-o lista liniara, exista un singur succesor, descendent. Aici vor fi mai multi.
Trebuiesc indeplinite 2 cerinte
-Exista 1 singur nod care nu are ascendent , care se cheama radacina
-Toate celelalte noduri formeaza subarbori bijuncti intre ei.
Intre 2 subarbori nu pot fi noduri comune.
Acestea sunt organizate pe nivele
2
1

1
Nodurile care nu au descendenti: frunze
Arborii binari: maxim 2 fii la fiecare nod.
Exemplu:
2
7

5
4

2
3

7
4

1
2

9
3

//structura prin care se implementeaza un arbore binar; similar pentru structura pentru o lista
liniara dublu inlantuita
struct Nod

{
int val;
Nod*st, *dr;
}*rad;
Operatii
-adaugare nod
-parcurgerea arborelui intr-o anumita ordine (care poate fi de mai multe feluri)
-cautare nod
-stergerea unui nod
-stergerea intregului arbore
Operatiile de cautare adaugare si stergere depind de contextul alcatuirii algoritmului.
FIecare nod are maxim 2 descendenti care la randul lor sunt alti arbori.
Parcurgere
In functie de ordinea in care se parcurg nodurile avem 2 modalitati:
-intre cele 3 difera doar modul /momentul in care radacina este parcursa in raport cu ceilalti 2
descendenti ai sai
-in preordine (radacina, subarbore stang, subarbore drept): 2,7,5,4,7,4,3,5,3,2,1,9,3,1,2
-in inordine (subarbore stang, radacina, subarbore drept): 4,4,7,5,3,5,3,7,1,9,2,2,2,1,3
-in postordine (subarbore stang, subdrept, radacina): 4,5,3,7,4,3,5,9,1,2,7,2,1,3,2
Alte exemple:
15
8
5

20
23

10
7

12
11

21
13

27
24
25

RSD: 15,8,5,7,6,10,12,11,19,20,23,21,27,24,25
SRD: 5,6,7,8,10,11,12,13,15,20,21,23,24,25,27
SDR: 6,7,5,11,13,12,10,8,21,25,24,27,23,20,15
void Preordine(Nod*rad)
{
if (rad!=NULL)

{
cout<<rad->val<< ;
Preordine(rad->st);
Preordine(rad->dr);
}
}
void Inordine(Nod*rad)
{
if (rad!=NULL)
{
Inordine(rad->st);
cout<<rad->val;
Inordine(rad->dr);
}
}
void StergereArb(Nod*&rad)
{
if(rad!=NULL)
{
stergereArb(rad->st);
stergereArb(rad->dr);
delete rad;
}
}
Aceste operatii se comporta la fel indiferent de tipul arborelui binar.
Celelalte operatii ar fi adaugarea unui nod, stergerea, cautarea intr-un arbore. Depind de
relatiile intre nodurile arborelui.
Se va discuta despre un caz particular de noduri. De cautare/ sortare mai exact.
Ei sunt arbori binari care au ca proprietate: valoarea fiecarui nod este mai mare decat
totalitatea nodurilor din valorile celor din stanga si de valorile nodurilor dindreapta.
Totodata, toate valorile sunt distincte, asadar nu pot exista valori repetitive. No shit.
Prin urmare, putem zice ca toate valorile nodurilor sunt strict mai mari unii decat altii. Sau
ceva de genul.
Adaugare
Crearea arborelui se va face prin adaugare element dupa element.
In cazul de fata este dorita crearea unui arbore astfel incat valorile sa fie parcurse in
ordine crescatoare.
Toate nodurile din subarborele stang trebuie sa fie mai mici decat radacina, iar toate
nodurile din subarborele drept trebuie sa fie mai mari decat radacina

Functia de adaugare
void AdaugareNod(Nod*&rad, int val)
{
if (rad!=NULL)

{
if(valnoua<rad->val)
AdaugNod(rad->st,valnoua);
else
if(valnoua>rad->val)
AdaugNod(rad->dr,valnoua);
else
cout<<Nodul exista deja;
}
else
{
//am gasit pct de adaugare
rad=new Nod;
rad->val=valnoua;
rad->st=rad->dr=NULL;
}
bool CautaNod(Nod*rad,int valcout)
{
if (rad!=NULL)
if(valcaut<rad->val)
return CautaNod(rad->st,valcout)
else
if(valcout>rad->val)
return CautaNod(rad->dr, valcout);
else
return true;
else
return false;
}

You might also like