#include #include #include #include struct tree { char value[50]; struct tree* left; struct tree* right; }; struct tree* read_tree(int* counter){ //read one node int* c = counter; //printf("%d\n", *c); char buffer[50]; memset(buffer,0,50); char* r = fgets(buffer,50,stdin); int x = strlen(buffer); buffer[x-1]='\0'; if(r == NULL){ printf("Chybna databaza\n"); 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'; if(buffer[0] != '\0'){ printf("Chybna databaza\n"); exit(0); } } return node; } } void search(struct tree* this){ //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(answer[0] == '\n'){ search(this); } 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(answer[0] == 'n'){ //the same for the right side if(this->right->value[0] == '*'){ printf("%s\n", this->right->value); printf("Koniec\n"); exit(0); } printf("%s\n", this->right->value); search(this->right); } else{ //if input is wrong printf("Nerozumiem\n"); exit(0); } } 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); root = NULL; } int count_leaves(struct tree* node){ int count = 0; //if left and right nodes are empty if(node->left == NULL && node->right == NULL){ count++;; } else{ //if left isn't NULL than count if(node->left != NULL){ count += count_leaves(node->left); } if(node->right != NULL){ count += count_leaves(node->right); } } return count; } int count_all(struct tree* node){ if(node == NULL){ return 0; } int count = 0; if(node->left != NULL){ count += count_all(node->left); } if(node->right != NULL){ count += count_all(node->right); } count++; return count; } int main(){ printf("Expert z bufetu to vie.\n"); struct tree* tree = NULL; int counter = 0; tree = read_tree(&counter); int count = count_leaves(tree); printf("Pozna %d druhov ovocia a zeleniny.\n", count); printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); printf("%s\n", tree->value); search(tree); destroy_tree(tree); return 0; }