Documente Academic
Documente Profesional
Documente Cultură
Un arbore reprezint o colecie de noduri relaionate ntre ele n mod ierarhic. Fiecare nod are asociat
o anumit informaie, de exemplu informaii despre angajaii unei companii (vezi Figura 1), arborele
reprezentnd n acest caz ierarhia de organizare a companiei.
noduri frunz
n exemplul de mai sus, Andrei Alexandru este rdcina arborelui, deoarece nu are nici un printe.
Copiii si direci sunt: Matei Rzvan, Tudor Alin i Popescu Victor, care au la rndul lor ali copii.
Acetia din urm sunt frunze ale arborelui, deoarece nu mai au ali copii.
Fiecare nod al unui arbore binar reine informaia propriu-zis, precum i adresele de memorie a
copiilor din stnga i din dreapta, dac acetia exist (vezi Figura 2). Structura unui astfel de nod poate
fi de tipul urmtor:
struct NOD
{
int informatie;
struct NOD *adresa_copil_dreapta;
struct NOD *adresa_copil_stanga;
}
adresa: 100 300 inf. NULL adresa: 200 NULL inf. NULL nivel 2
Arborele binar de cutare este un arbore binar particular care stocheaz suplimentar informaiilor
existente o valoare numeric cu rol de ordonare. Acesta are proprietatea c, pentru oricare nod n,
fiecare dintre descendenii din subarborele din stnga are valoarea numeric mai mic dect a nodului
n, iar fiecare din descendenii din subarborele din dreapta va avea valoarea informaiei mai mare sau
egal. Un exemplu de arbore binar de cutare este ilustrat n Figura 3.
20
10 30
5 15 78
P4.1 S se realizeze un program ce permite implementarea unui arbore binar de cutare, precum i a
operaiilor uzuale cu acesta. Programul permite afiarea pe ecran a unui meniu cu urmtoarele
operaii posibile:
- [1] Citirea unei valori de la tastatur i inserarea acesteia n arbore;
- [2] Afiarea arborelui n preordine;
- [3] Afiarea arborelui n inordine;
- [4] Afiarea arborelui n postordine;
- [5] tergerea unui subarbore, descendent dintr-un nod specificat;
- [6] Cutarea unui nod n arbore;
- [0] Ieire din program.
Fiecare opiune din meniu va fi implementat folosind funcii.
Rezolvare:
#include<stdio.h>
#include<stdlib.h>
/* initializare informatii */
nod_nou->x=x;
nod_nou->NOD_stanga=NULL;
nod_nou->NOD_dreapta=NULL;
return nod_nou;
}
nod_nou=creare_nod(x);
if (prim==NULL)
{
/* arborele este vid */
prim=nod_nou;
printf("A fost adaugat primul nod: %d. \n", prim->x);
return prim;
}
else
{
/* pozitionare in arbore pe parintele nodului nou */
nod_curent=prim;
while (nod_curent!=NULL)
{
nod_parinte=nod_curent;
return prim;
}
}
return NULL;
}
int main()
{
struct NOD *prim=NULL, *nod_gasit;
char operatie;
int x;
printf("MENIU: \n");
printf("[1] Inserare nod in arbore \n");
printf("[2] Afisare arbore preordine \n");
printf("[3] Afisare arbore inordine \n");
printf("[4] Afisare arbore postordine \n");
printf("[5] Stergere arbore \n");
printf("[6] Cautare nod in arbore \n");
printf("[0] Iesire din program \n");
printf("\n");
switch (operatie)
{
case '1':
printf("#Inserare nod in arbore# \n");
printf("Introduceti valoarea nodului care va fi inserat: ");
scanf("%d", &x);
prim=inserare_nod(prim, x);
break;
case '2':
printf("#Afisare arbore preordine# \n");
if (prim==NULL)
printf("Atentie: Arborele este gol.");
else
afisare_preordine(prim);
break;
case '3':
printf("#Afisare arbore inordine# \n");
if (prim==NULL)
printf("Atentie: Arborele este gol.");
else
afisare_inordine(prim);
break;
case '4':
printf("Afisare arbore postordine: \n");
if (prim==NULL)
printf("Atentie: Arborele este gol.");
else
afisare_postordine(prim);
break;
case '5':
printf("#Stergere arbore# \n");
if (prim==NULL)
printf("Atentie: Arborele este gol.");
else
{
printf("Introduceti valoarea nodul al carui arbore va fi sters: ");
scanf("%d", &x);
nod_gasit=cauta_nod(prim, x);
if (nod_gasit!=NULL)
{
nod_gasit->NOD_stanga=
stergere_arbore(nod_gasit->NOD_stanga);
case '6':
printf("#Cautare nod in arbore# \n");
if (prim==NULL)
printf("Atentie: Arborele este gol.");
else
{
printf("Introduceti valoarea nodului: ");
scanf("%d", &x);
cauta_nod(prim, x);
}
break;
case '0':
printf("Iesire din program \n");
stergere_arbore(prim);
system("PAUSE");
return 0;
break;
default:
printf("Operatie invalida \n");
}
} while(1);
}
Discuie:
- Acest program implementeaz un arbore binar de cutare, ale crui noduri conin ca informaie
numere ntregi. Fiecare nod al arborelui este de tipul struct NOD. Nodurile relaioneaz
ntre ele prin intermediul pointerilor struct NOD *NOD_stanga i struct NOD
*NOD_dreapta, care stocheaz adresele de memorie ale copiilor acestora;
- Funcia struct NOD *creare_nod(int x) este o funcie general, prin intermediul
creia se creeaz i se aloc memorie pentru un nod nou. Coninutul acestuia este iniializat cu
informaia primit ca parametru de intrare (int x), iar locaiile copiilor sunt iniializate cu
NULL, deoarece n prima faz acest nod nu este inserat n arbore. Adresa nodului nou creat
este returnat printr-un pointer la structura NOD;
- Afiarea arborelui se realizeaz folosind cele trei tipuri de parcurgere a unui arbore: preordine,
inordine i postordine. Aceste denumiri corespund modului n care se viziteaz rdcina:
preordine: se viziteaz mai nti rdcina, copilul (copiii) din stnga, iar apoi copilul
(copiii) din dreapta;
inordine: se viziteaz mai nti copilul (copiii) din stnga, apoi rdcina i copilul
(copiii) din dreapta;
postordine: se viziteaz copilul (copiii) din stnga, apoi copilul (copiii) din dreapta i
apoi rdcina.
Fiecare tip de afiare este implementat ntr-o funcie separat, ce primete ca parametru de
intrare adresa de memorie a nodului rdcin: void afisare_preordine(struct
NOD *prim), void afisare_inordine(struct NOD *prim), void
afisare_postordine(struct NOD *prim). Funciile sunt recursive, astfel nct este
important s nelegem ce se ntmpl pe unul din niveluri (de exemplu pe primul), pe restul
procedndu-se identic;
- Cutarea unui nod n arbore se realizeaz cu ajutorul funciei recursive struct NOD*
cauta_nod(struct NOD *tmp, int x) ce primete ca parametru de intrare adresa de
memorie a nodului rdcin i valoarea nodului ce se dorete a fi cutat. Funcia se
autoapeleaz, vizitnd nodurile n funcie de valoarea nodului cutat, dup aceeai regul de
comparaie definit n cazul inserrii unui nod. Condiia de oprire este ndeplinit fie atunci
- Meniul programului este implementat n funcia main(), prin intermediul cruia utilizatorul
poate apela funciile definite mai sus.
3 Implementai operaiile de afiare, tergere i cutare a nodurilor unui arbore folosind funcii
nerecursive.