You are on page 1of 11

Raport la

Structuri de date si algoritmi

Tema :

Arbori binari
Elaborat:

Verificat :

Chisinau 2017
Daca ne-am uita la un arbore genealogic , sau la o ierarhie de comanda intr-o firma , vom observa
informatiile aranjate intr-un arbore.
Un arbore este compus dintr-o colectie de noduri , unde fiecare nod are asociata o anumita
informatie si o colectie de copii.
Copii unui nod sunt noduri care urmeaza imediat sun nodul insasi.
Parintele unui nod este acel nod care se afla imediat deasupra.
unui arbore este acel nod unic , care nu are nici un parinte.
Toti arborii au urmatoarele proprietati :
Exista o singura radacina ;
Toate nodurile , cu exceptia radacinii , au exact un singur parinte ;
Nu exista cicluri .aceasta inseamna ca pornind de la un anumit nod , nu exista un anumit traseu pe
care il putem parcurge , astfel incit sa ajungem inapoi la nodul de plecare ;
Arborii binary sunt un tip aparte de arbori , in care fiecare nod are maxim 2 copii .Pentru un nod dat , intr-
un arbore binary , vom avea copilul din stinga si copilul din dreapta .
Exemplu de arbori binari :

Arborele din figura a) are 8 noduri , respective nodul 1 este radacina .Acesta are ca si copil sting nodul nr
2 , iar ca copil din dreapta nodul nr 3 , la rindul lui nodul nr 2 nu are decit un copil de stinga , si anume
nodul nr 4 .
Deci un nod dintr-un arbore binar poate avea 2 copii ( dreapta , stinga ) sau unul singur de dreapta sau de
stinga sau nici unul cum este nodul nr 8.
Nodurile care nu au copii se numesc noduri frunza .
Nodurile care au 1 sau 2 copii se numeste noduri interne.

Arbori binari de cautare(BST)


Un arbore binary de cautare este un arbore binary destinat imbunatatirii timpului de cauatre a informatiei.El trebuie sa respecte
urmatoare proprietate : pentru orice nod n , fiecare din descendentii din subarborele din sting ava avea valoarea informatiei mai
mica decit a nodului n , iar fiecare din descendentii din subarborele din dreapta va avea valoarea informatiei mai mare decit

nodul n .

In figura de mai sus avem 2 arbori binari , deoarece respecta regula de mai sus.
Laborator N4

Este considerat un graf determinat schematic prin urmtorul desen:

1) Se cere ca acest graf s fie reprezentat prin urmtoarele structuri:

a) Lista generalizat;
#include <cstdlib>
#include <iostream>
#include<conio.h>
#include<stdio.h>
using namespace std;

struct nod
{ char inf;
nod *leg, *infleg;
bool tag;
} ARB;

nod * Creare()
{ char info;
int i; nod *p;

char unu,doi;
cout<<"informatia nodului: "; cin>>info;
p=new nod; p->inf=info;
a: cout<<"nodul "<<info<<" are succesori? (da/nu) "; cin>>unu>>doi;
if((unu=='d')&&(doi=='a')) {p->infleg=Creare();}
else if((unu=='n')&&(doi=='u')) {p->infleg=NULL;}
else {cout<<"nu ati introdus corect, trebuie de scris \"da\" sau \"nu\""; goto a;}
b: cout<<"nodul "<<info<<" mai are noduri neintroduse pe un nivel cu el? (da/nu) ";
cin>>unu>>doi;
if((unu=='d')&&(doi=='a')) {p->leg=Creare();}
else if((unu=='n')&&(doi=='u')) {p->leg=NULL;}
else {cout<<"nu ati introdus corect, trebuie de scris \"da\" sau \"nu\""; goto b;}
if((p->infleg==NULL)&&(p->leg==NULL)) return p;
return p;
}

void Sterge(nod *p)


{
if(p->leg) Sterge(p->leg)
if(p->infleg) Sterge(p->infleg);
delete p;
}

void afisare(nod *p)


{
cout<<"\nvaloarea nodului: "<<p->inf;
while(p->infleg!=NULL) {cout<<endl<<p->inf<<" are succesori."; afisare(p->infleg);
while(p->leg!=NULL) {cout<<endl<<p->inf<<" are alte noduri pe un nivel cu el.";
afisare(p->leg);}}

int main()
{
nod *rad; char p,q;
cout<<"\n\t\tIntroduceti arborele:\n";
cout<<"Informatia radacinei: "; cin>>rad->inf;
cout<<"Radacina are succesori? (da/nu)"; cin>>p>>q;
if((p=='d')&&(q=='a')) rad->leg=Creare();
else rad->leg=NULL;
afisare(rad);
cout<<"\n\t\tStergerea arborelui.\n";
Sterge(rad);

system("PAUSE");
return EXIT_SUCCESS;
}

//Se va introduce de la tastatura:


//a da b da e nu da f da j nu da k nu nu nu da c da g nu da h da l nu da m nu nu nu da d
da i da n nu nu nu nu

Structuri nlnuite, model succesor


#include <cstdlib>
#include <iostream>
#include<conio.h>
#include<stdio.h>
using namespace std;

struct nod
{ char inf;
int n; //numarul de descendenti
nod *leg[10]; //tabloul adreselor descendentilor
} ARB;

nod * Creare() //creaza arborele oarecare si returneaza adresa radacinii


{ char info;
int nr,i; nod *p;
cout<<"informatia nodului: "; cin>>info;
p=new nod; p->inf=info;
cout<<"numarul descendentilor pentru "<<info<<": ";
cin>>nr; p->n=nr;
//se descriu in ordine descendentii de la stanga la dreapta si in adancime
for(i=0;i<p->n;i++) p->leg[i]=Creare();
//apelez recursiv functia pentru crearea descendentilor
return p; //radacina arborelui}
}

void Sterge(nod *p) //stergerea unui nod din arbore


{ int i;
if(p)
for(i=0;i<p->n;i++) Sterge(p->leg[i]);
//mai intai sterg descendentii nodului
delete p; //sterg nodul tata}
}
int main()
{
nod *rad;
cout<<"\n\t\tIntroduceti arborele:\n";
Creare();
cout<<"\n\t\Stergerea arborelui.\n";
Sterge(rad);

system("PAUSE");
return EXIT_SUCCESS;
}
a) Lista nlnuit, model predecesor - TATA.
#include <cstdlib>
#include <iostream>
#include<conio.h>
#include<stdio.h>
using namespace std;

struct nod
{ char inf;};

struct grup
{nod *tata, *componente[10];};

nod *Creare()
{ char info;
int nr,i; nod *p;
cout<<"informatia nodului: "; cin>>info;
p=new nod; p->inf=info;
return p;
}

int main()
{
grup *gr;
int nrcomp,nrgrupuri;
cout<<"Cate grupuri de frati sunt? "; cin>>nrgrupuri;

cout<<"Cati frati sunt in grup? "; cin>>nrcomp;


for(int i=0;i<nrcomp;i++)
{cout<<"\ncrearea fratelui\n";
gr->componente[i]=creare();}
cout<<"\ncrearea tatalui\n"; gr->tata=creare();

for(int k=1;k<nrgrupuri;k++)
{cout<<"Cati frati sunt in grup? "; cin>>nrcomp;
for(int i=1;i<nrcomp;i++)
{cout<<"\ncrearea fratelui\n";
gr->componente[i]=creare();}
cout<<"\ncrearea tatalui\n"; gr->tata=creare();
}

cout<<"\n\t\Stergerea arborelui.\n";
Sterge(rad);

system("PAUSE");
return EXIT_SUCCESS;
}

Concluzie: La aceasta lucrare am invatat a lucra cu arborii binari , unde fiecare arbore
binar are o cheie unica , iar fiecare cheie are predecesor, iar cheia subarborelui sting
trebuie sa fie mai mica decit cheia celui din dreapta.