Sunteți pe pagina 1din 11

Ministerul Educației și Cercetării

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatică și Microelectronică

Ingineria Biomedicală

RAPORT
Lucrare de Laborator nr. 4
la Structuri de Date si Algoritmi

Elaborat: Lungu Andrian

st. gr. IBM-221

Verificat: Buzurniuc Șt.

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.

Indicaţii: 1. La realizarea operaţiei de afişare la ecran a informaţiei referitor la nodurile arborelui a


se prevedea și afişarea adreselor din memorie ale nodului curent 2. Funcțiile de prelucrare ale
arborelui binar trebuie implementate folosind algoritmi recursivi pentru parcurgerea arborelui “în
adîncime” (parcurgerea “în inordine”: rădăcină -> subarbore stâng(drept) -> subarbore drept(stâng);
“în postordine”: subarbore stâng(drept) -> subarbore drept(stâng) -> rădăcină) și în

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()

using namespace std;

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;
}

// adugarea info in new node


BusStop* inputNewNode() {
int stopNumber;
string stopName;
cout << "Numarul opririi: ";
cin >> stopNumber;
cout << "Denumirea opririi: ";
cin.ignore();
getline(cin, stopName);
return createNewNode(stopNumber, stopName);
}

// add new node


void addNode(BusStop*& root) {
BusStop* newNode = inputNewNode();
if (root == nullptr) {
root = newNode;
cout << "Nodul nou a fost adaugat cu succes" << endl;
}
else {
BusStop* current = root;
bool added = false;
while (!added) {
if (newNode->stopNumber < current->stopNumber) {
if (current->left == nullptr) {
current->left = newNode;
cout << "Nodul nou a fost adaugat in partea stanga" << endl;
added = true;
}
else {
current = current->left;
}
}
else if (newNode->stopNumber > current->stopNumber) {
if (current->right == nullptr) {
current->right = newNode;
cout << "Nodul nou a fost adaugat in partea dreapta" << endl;
added = true;
}
else {
current = current->right;

}
}
else {
cout << "Error: deja exista " << newNode->stopNumber << "deja exista" << endl;
delete newNode; // delete new node
added = true;
}
}
}
}

void printNode(BusStop* node) {


cout << "Numarul opririi: " << node->stopNumber << endl;
cout << "denumirea opririi: " << node->stopName << endl;
}
// parcuregerea arborelui
void preOrderTraversal(BusStop* root) {
if (root != nullptr) {
printNode(root);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
}
// parcurgerea arborelui in sens invers
void postOrderTraversal(BusStop* root) {
if (root != nullptr) {
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printNode(root);
}
}

// parcuregearea arborelui in sens direct


void inOrderTraversal(BusStop* root) {
if (root != nullptr) {
inOrderTraversal(root->left);
printNode(root);
inOrderTraversal(root->right);
}
}
// informatia despre noduri
void printTree(BusStop* root) {
if (root != nullptr) {
printTree(root->left);
printNode(root);
printTree(root->right);
}
}
// numarul de noduri
int countNodes(BusStop* root) {
if (root == nullptr) {
return 0;
}
else {
return countNodes(root->left) + 1 + countNodes(root->right);
}
}
BusStop* searchNode(BusStop* root, int stopNumber) {
if (root == nullptr) {
return nullptr;
}
if (root->stopNumber == stopNumber) {
return root;
}
BusStop* leftResult = searchNode(root->left, stopNumber);
if (leftResult != nullptr) {
return leftResult;
}
return searchNode(root->right, stopNumber);
}
// schimbul informatiei in noduri dupa denumire
void updateNode(BusStop* root, int stopNumber) {
BusStop* nodeToUpdate = searchNode(root, stopNumber);
if (nodeToUpdate == nullptr) {
cout << "Numarul nodului " << stopNumber << "error" << endl;
}
else {
string newStopName;
cout << "Adauga denumirea noua a opririi: ";
cin.ignore();
getline(cin, newStopName);
nodeToUpdate->stopName = newStopName;
cout << " Nodul" << stopNumber << " a fost schimbat cu succes" << endl;
}
}

// schimbul cu locului a 2 noduri


void swapNodes(BusStop*& root, int stopNumber1, int stopNumber2) {
BusStop* node1 = searchNode(root, stopNumber1);
BusStop* node2 = searchNode(root, stopNumber2);
if (node1 == nullptr || node2 == nullptr) {
cout << "unul sau 2 noduri nu au fost gasite" << endl;
}
else {
// schimbul de informatie a 2 noduri
int tempStopNumber = node1->stopNumber;
node1->stopNumber = node2->stopNumber;
node2->stopNumber = tempStopNumber;
string tempStopName = node1->stopName;
node1->stopName = node2->stopName;
node2->stopName = tempStopName;
cout << "Numarul nodului" << stopNumber1 << " si " << stopNumber2 << "au fost schimbate cu succes"
<< endl;
}
}

// 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;
}

S-ar putea să vă placă și