Documente Academic
Documente Profesional
Documente Cultură
Ingineria Biomedicală
RAPORT
Lucrare de Laborator nr. 4
la Structuri de Date si Algoritmi
Chișinău 2022
Lucrarea de laborator nr. 4
Теmа: Implementarea tipului abstract de date „Arbore binar”. Utilizarea algoritmilor recursivi.
Scopul lucrării: Obţinerea deprinderilor practice de implementare și de utilizare a tipului abstract de
date (TAD) „Arbore binar” cu asigurarea operațiilor de prelucrare de bază ale arborelui binar
oarecare prin parcurgerea nodurilor arborelui “în adâncime”.
Sarcină: Să se scrie un fişier al utilizatorului, funcţia mаin() pentru prelucrarea arborelui binar
oarecare cu afişarea la ecran a următorului meniu de opţiuni:
1. Crearea nodurilor arborelui binar în memoria dinamică și introducerea informaţiei despre
nodurile arborelui de la tastatură în mod interactiv.
2. Afişarea informaţiei despre nodurile arborelui la ecran : a) în preordine, b) postordine și c) în
inordine.
3. Căutarea nodului în arbore și determinarea numărului de așa noduri în arbore.
4. Modificarea informației unui nod din arbore.
5. Schimbă cu locurile 2 noduri indicate.
6. Determinarea înălţimii arborelui.
7. Eliberarea memoriei alocate pentru arbore.
0. Ieşirea din program.
Varianta 4
Un arbore binar este o structură de date ierarhică în care fiecare nod poate avea cel mult doi fii. Fiecare nod
din arbore este conectat la alte noduri prin muchii, iar rădăcina arborelui este nodul de la care începe
arborele. Această structură este utilizată pentru a organiza informațiile într-un mod eficient și pentru a
facilita accesul la acestea. Arborele binar este folosit în multe domenii, inclusiv în algoritmi de căutare și
sortare, reprezentarea codului binar și în rețelele de calculatoare.
#include <iostream>
#include <cstdlib> //exit()
struct BusStop {
int stopNumber;
string stopName;
BusStop* left;
BusStop* right;
};
// new node
BusStop* createNewNode(int stopNumber, string stopName) {
BusStop* newNode = new BusStop;
newNode->stopNumber = stopNumber;
newNode->stopName = stopName;
newNode->left = nullptr;
newNode->right = nullptr;
return newNode;
}
}
}
else {
cout << "Error: deja exista " << newNode->stopNumber << "deja exista" << endl;
delete newNode; // delete new node
added = true;
}
}
}
}
// inaltimea arborelui
int height(BusStop* root) {
if (root == nullptr) {
return 0;
}
else {
int leftHeight = height(root->left);
int rightHeight = height(root->right);
if (leftHeight > rightHeight) {
return leftHeight + 1;
}
else {
return rightHeight + 1;
}
}
}
// eliberarea memoriei
void freeMemory(BusStop* root) {
if (root != nullptr){
freeMemory(root->left);
freeMemory(root->right);
delete root;
}
}
int main() {
BusStop* root = nullptr;
while (true) {
cout << "Selectati:" << endl;
cout << "1. Adauga un nod nou" << endl;
cout << "2. Parcurgeti arborele in sens direct" << endl;
cout << "3. Parcurgeti arborele in sens invers " << endl;
cout << "4. Parcurgeti arborele simetric" << endl;
cout << "6. Cautarea nodului" << endl;
cout << "7. Schimba informatia din nod" << endl;
cout << "8. Schimba locul a 2 noduri" << endl;
cout << "9. Afla inaltimea arborelui" << endl;
cout << "10. Exit" << endl;
int choice;
cin >> choice;
int stopNumber, stopNumberToUpdate, stopNumber1, stopNumber2;
BusStop* foundNode;
switch (choice) {
case 1:
addNode(root);
break;
case 2:
cout << "Arbore (sens direct):" << endl;
preOrderTraversal(root);
break;
case 3:
cout << "Arbore (sens invers):" << endl;
postOrderTraversal(root);
break;
case 4:
cout << "Arbore (simetric):" << endl;
inOrderTraversal(root);
break;
case 5:
cout << "Scrieti numarul opririi: ";
cin >> stopNumber;
foundNode = searchNode(root, stopNumber);
if (foundNode == nullptr) {
cout << "Nodul cu numarul " << stopNumber << " nu a fost gasit" << endl;
}
else {
cout << "Nodul a fost gasit:" << endl;
printNode(foundNode);
}
break;
case 6:
cout << "Scrieti numarul opririi pentru a schimba informatia: ";
cin >> stopNumberToUpdate;
updateNode(root, stopNumberToUpdate);
break;
case 7:
cout << "Scrieti numarul primei opriri: ";
cin >> stopNumber1;
cout << "Scrieti numarul a 2 opriri: ";
cin >> stopNumber2;
swapNodes(root, stopNumber1, stopNumber2);
break;
case 8:
cout << "Arborele:" << endl;
printTree(root);
cout << "Inaltimea: " << height(root) << endl; // inaltimea
break;
case 9:
cout << "Exit" << endl;
return 0;
default:
cout << "Error" << endl;
break;
}
cout << endl;
}
return 0;
}