#include #include #include #include #define SIZE 256 // Struktúra uzla typedef struct tree { char value[SIZE]; struct tree* left; struct tree* right; } Tree; // Funkcia na vytvorenie nového uzla Tree* create_node(const char* value) { Tree* node = malloc(sizeof(Tree)); if (node) { strncpy(node->value, value, SIZE); node->left = NULL; node->right = NULL; } return node; } // Funkcia na načítanie stromu Tree* read_tree() { char buffer[SIZE]; memset(buffer, 0, SIZE); // Čítanie riadku if (!fgets(buffer, SIZE, stdin)) { return NULL; } // Odstránenie znaku nového riadku buffer[strcspn(buffer, "\n")] = 0; if (buffer[0] == '\0') { return NULL; // Prázdny riadok znamená koniec } Tree* node = create_node(buffer); // Ak ide o odpoveď, nečítame podstromy if (buffer[0] == '*') { return node; } // Čítanie podstromov (ľavý a pravý uzol) node->left = read_tree(); node->right = read_tree(); return node; } // Funkcia na zničenie stromu void destroy_tree(Tree* tree) { if (tree) { destroy_tree(tree->left); destroy_tree(tree->right); free(tree); } } // Funkcia na preorder výpis stromu void print_tree(Tree* tree, int offset) { if (tree == NULL) return; for (int i = 0; i < offset; i++) { printf(" "); } printf("%s\n", tree->value); print_tree(tree->left, offset + 3); print_tree(tree->right, offset + 3); } void ask_question(Tree* tree) { if (!tree) return; printf("%s (a/n) ?\n", tree->value); // Ak ide o odpoveď, ukončujeme if (tree->left == NULL && tree->right == NULL) { printf("Koniec\n"); return; } char answer; scanf(" %c", &answer); // Kontrola platnej odpovede if (answer == 'a') { ask_question(tree->left); // Pre odpoveď "a" } else if (answer == 'n') { ask_question(tree->right); // Pre odpoveď "n" } else { printf("Neplatná odpoveď, koniec.\n"); } } int main() { // Načítanie stromu zo vstupu Tree* root = read_tree(); // Ak strom nie je prázdny if (root == NULL) { printf("Chyba pri načítaní pravidiel.\n"); return 1; } // Preverenie a počítanie listových uzlov int num_items = 0; Tree* temp = root; // Rekurzívne prechádzanie a počítanie void count_items(Tree* tree) { if (tree == NULL) return; if (tree->left == NULL && tree->right == NULL) { num_items++; } count_items(tree->left); count_items(tree->right); } count_items(root); printf("Pozna %d druhov ovocia a zeleniny.\n", num_items); // Spustenie otázok ask_question(root); // Uvoľnenie pamäte destroy_tree(root); return 0; }