This commit is contained in:
Maryna Kravtsova 2020-11-22 20:18:18 +01:00
parent deee10505b
commit 6d9c7de58a

View File

@ -12,8 +12,9 @@ struct tree {
struct tree* read_tree(int* counter){
//read one node
int* c = counter;
//printf("%d\n", *c);
char buffer[50];
memset(buffer,0,50);
@ -26,24 +27,39 @@ struct tree* read_tree(int* counter){
exit(0);
}
if(buffer[0] != '\0'){
struct tree* node = calloc(1,sizeof(struct tree));
memcpy(node->value, buffer,50);
//count all nodes
*c += 1;
counter = c;
//until i find "*", recursively read tree
if(buffer[0] != '*'){
//first check left side, if the isn't node, add it
if(node->left == NULL){
node->left = read_tree(counter);
}
//than check right side
if(node->right == NULL){
node->right = read_tree(counter);
}
}
//if i found root with left and right node, decrease my counter
if(node->left != NULL && node->right != NULL){
*c -= 2;
counter = c;
}
//if binary tree is okay, than counter is 1(there is one root)
if(*c == 1){
//if the user still inseting, than the databaze wrong
r = fgets(buffer,50, stdin);
int x = strlen(buffer);
buffer[x-1]='\0';
@ -59,35 +75,38 @@ struct tree* read_tree(int* counter){
}
void search(struct tree* this){
char buffer[5];
memset(buffer,0,5);
char* r = fgets(buffer,5,stdin);
//read answer
char answer[5];
memset(answer,0,5);
char* r = fgets(answer,5,stdin);
if(r == NULL){
printf("Koniec vstupu\n");
exit(0);
}
if(buffer[0] == '\n'){
if(answer[0] == '\n'){
search(this);
}
/*if(buffer[0] != 'a' || buffer[0] != 'n' || buffer[0] != '\n'){
printf("Nerozumiem\n");
exit(0);
}*/
if(buffer[0] == 'a'){
if(answer[0] == 'a'){
//if left node is answer, print it and end the program
if(this->left->value[0] == '*'){
printf("%s\n", this->left->value);
printf("Koniec\n");
exit(0);
}
//else print it and continue searching
printf("%s\n", this->left->value);
search(this->left);
}
else if(buffer[0] == 'n'){
else if(answer[0] == 'n'){
//the same for the right side
if(this->right->value[0] == '*'){
printf("%s\n", this->right->value);
printf("Koniec\n");
@ -98,26 +117,19 @@ void search(struct tree* this){
}
else{
//if input is wrong
printf("Nerozumiem\n");
exit(0);
}
}
void print_tree(struct tree* tree,int offset){
int i;
for (i = 0; i < offset; i++){
printf(" ");
}
printf("%s",tree->value);
if (tree->left){
print_tree(tree->left,offset +3);
print_tree(tree->right,offset +3);
}
}
void destroy_tree(struct tree* root){
//if root is NULL,than tree is empty
if(root == NULL) return;
//go to the left side and than to the right
destroy_tree(root->left);
destroy_tree(root->right);
free(root);
@ -125,10 +137,14 @@ void destroy_tree(struct tree* root){
}
int count_leaves(struct tree* node){
int count = 0;
//if left and right nodes are empty
if(node->left == NULL && node->right == NULL){
count = 1;
count++;;
}
else{
//if left isn't NULL than count
if(node->left != NULL){
count += count_leaves(node->left);
}
@ -143,13 +159,14 @@ int count_all(struct tree* node){
if(node == NULL){
return 0;
}
int count = 1;
int count = 0;
if(node->left != NULL){
count += count_all(node->left);
}
if(node->right != NULL){
count += count_all(node->right);
}
count++;
return count;
}