Sunteți pe pagina 1din 8

Lucrare de laborator

la disciplina
Structuri de Date și Algoritmi
Lucrare de laborator nr. 3:

Tema:
Implementarea tipului de date abstract “Arbore binar” în limbajul C.

Scopul lucrării
Scopul lucrării este de a familiariza studentul cu mecanismul de creare a arborelui binar și
operații elementare asupra acestuia, utilizînd pentru aceasta limbajul C.
Problema

1. Să se elaboreze un program ce va aloca dinamic un arbore binar de structuri și va


realiza următoarele funcții, unde funcțiile date reprezintă opțiuni organizate într-un
meniu în cadrul programului:
- citirea de la tastatură a elementelor arborelui;
- afișarea la consolă a elementelor arborelui;
- calcularea adîncimii arborelui;
- căutarea unui nod în baza unei chei de căutare;
- calcularea adîncimii unui nod ( nodul va fi selectat în baza unei chei de căutare );
- calcularea înălțimii unui nod ( nodul va fi selectat în baza unei chei de căutare );
- afișarea tuturor frunzelor arborelui;
- curățirea elementelor arborelui;
- eliberarea memoriei arborelui.

Rezultatul
Rezultaul lucrării se va plasa într-un raport, unde va fi inclusă foaia de titlu și codul sursă a
programului cu o poză de execuție a acestuia.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define Say 10

typedef struct BinaryTreeNode


{
int data;
struct BinaryTreeNode * left;
struct BinaryTreeNode * right;
}BinaryTreeNode;

typedef struct BinaryTree


{
struct BinaryTreeNode * root;
}BinaryTree;

BinaryTreeNode * newBinaryTreeNode(int data)


{
BinaryTreeNode * new_node = calloc(sizeof(BinaryTreeNode),1);
new_node->data = data;
return new_node;
}

void addNewN(BinaryTreeNode * current_node , BinaryTreeNode * new_node)


{
if(current_node)
{
if(current_node->data > new_node->data)
{
if(current_node->left)
{
addNewN(current_node->left,new_node);
} else
{
current_node->left = new_node;
}
} else
{
if(current_node->right)
{
addNewN(current_node->right,new_node);
} else
{
current_node->right = new_node;
}
}
}

}
void TreeShow(BinaryTreeNode *my_node, int delik)
{
if (my_node == NULL)
return;

delik += Say;

TreeShow(my_node->right, delik);

printf("\n");
for (int i = Say; i < delik; i++)
printf(" ");
printf("%d\n", my_node->data);

TreeShow(my_node->left, delik);
}

void Show(BinaryTreeNode *my_node)


{
TreeShow(my_node, 0);
}

void insertNewNodeInTree(BinaryTree * myBinaryTree)


{
int data;
scanf("%d",&data);
BinaryTreeNode * new_node = newBinaryTreeNode(data);
if(myBinaryTree->root)
{
addNewN(myBinaryTree->root, new_node);
}
else
{
myBinaryTree->root = new_node;
}

int TreeDepth(BinaryTreeNode * node)


{
if(node == NULL)
{
return -1;
}
else
{
int max_Left = TreeDepth(node->left);
int max_Right = TreeDepth(node->right);

if(max_Left>max_Right)
{
return (max_Left+1);
}
else
{
return (max_Right+1);
}
}
}
void DeleteTreeNode(BinaryTreeNode *node)
{
if(node)
{
DeleteTreeNode(node->left);
DeleteTreeNode(node->right);
free(node);
}
}

void ClearTree(BinaryTree * Tree)


{
if(Tree)
{
if(Tree->root)
{
DeleteTreeNode(Tree->root);
Tree->root = NULL;
}
}
}

void DeleteTree(BinaryTree *Tree)


{
if(Tree)
{
ClearTree(Tree);
free(Tree);
printf("Binary shaft deleted successfully\n");
}
}

BinaryTreeNode *SearchInTree(BinaryTreeNode *node, int key,int *sayici)


{
int zaf = 1;
if (node == NULL)
{
return NULL;
}
if(node->data == key)
{
printf("BinaryTree -> %d node\n",key);
return node;
}
if(node && key<node->data)
{
*sayici+=1;
SearchInTree(node->left,key,sayici);
}
else
{
*sayici+=1;
SearchInTree(node->right,key,sayici);
}
}

void TreeDepthKey(BinaryTreeNode * node, int key)


{
int sayici = 0;
BinaryTreeNode *current_node = NULL;
current_node = SearchInTree(node,key,&sayici);
printf("Max Binary Tree Depth is : %d",sayici);

struct BinaryTree * create_tree()


{
BinaryTree *my_binary = malloc(sizeof(struct BinaryTree));
my_binary->root = NULL;
return my_binary;
}

void PrintLeaf(BinaryTreeNode *node)


{

if(!node)
{
return;
}
if(node->left == NULL && node->right == NULL)
{
printf("%d ",node->data);
return;
}

if(node->left)
{
PrintLeaf(node->left);
}
if(node->right)
{
PrintLeaf(node->right);
}
}
void TreeHeightKey(BinaryTreeNode * node,int key)
{
BinaryTreeNode *current_node = NULL;
int sayici = 0;
current_node = SearchInTree(node,key,&sayici);
printf("Max Binary Tree Height is : %d",TreeDepth(current_node));
}
int menu()
{
int error_input_found = 0;
menu_start:
system("cls");
printf("\n Lab -3- \n");
printf("\n 1)Add Elements");
printf("\n 2)Show Tree");
printf("\n 3)Calculating the shaft depth");
printf("\n 4)Search Node");
printf("\n 5)Calculating the depth of a node");
printf("\n 6)Calculating the height of a node");
printf("\n 7)Display all tree leaves");
printf("\n 8)Clear elements from tree");
printf("\n 9)Releasing the memory of the tree");
printf("\n 10)Exit");
int command = 12;
if(error_input_found)
{
printf("\n\nSelect.\n");
}
printf("\n\nYour Option: ");
scanf("%d",&command);
while(command>12 || command<0)
{
printf("Option not exist .\n");
error_input_found = 1;
scanf("%*[^\n]");
goto menu_start;
}
return command;
}
int main()
{
int key;
int pos, size;
int command = 12;
BinaryTree *my_binary = NULL;
while(command)
{
command = menu();
if(command == 1)
{
if(my_binary != NULL)
{
DeleteTree(my_binary);
}
my_binary = create_tree();
printf("How many will you add node? : ");
scanf("%d",&size);
for (int i=0;i<size;i++)
{
insertNewNodeInTree(my_binary);
}
} else if(my_binary != NULL)
{
switch(command)
{
case 2:
{

if(my_binary->root == NULL)
{
printf("Binary is NULL\n");
}
else
{
Show(my_binary->root);
}
break;
}
case 3:
{
printf("Max Binary Tree Depth is :
%d",TreeDepth(my_binary->root));
break;
}

case 4:
{
int check = 0;
printf("Key : ");
scanf("%d",&key);
SearchInTree(my_binary->root,key,&check);
break;
}
case 5:
{
printf("Key : ");
scanf("%d",&key);
TreeDepthKey(my_binary->root,key);
break;
}
case 6:
{
printf("Key : ");
scanf("%d",&key);
TreeHeightKey(my_binary->root,key);
break;
}
case 7:
{
PrintLeaf(my_binary->root);
break;
}
case 8:
{
ClearTree(my_binary);
break;
}
case 9:
{
DeleteTree(my_binary);
my_binary = NULL;
break;
}
case 10:
{
return 0;
}
}
} else
{
printf("\nCreate a tree. \n");
}
printf("\n\nPress any Key to continue!\n");
_getch();
}
return 0;
}