#include #include #include #include #define SIZE 256 struct tree { char value[SIZE]; struct tree *left; struct tree *right; }; struct tree* read_tree() { char buffer[SIZE]; if (!fgets(buffer, SIZE, stdin) || buffer[0] == '\n') { return NULL; } buffer[strcspn(buffer, "\n")] = 0; struct tree *node = (struct tree*)malloc(sizeof(struct tree)); assert(node != NULL); strcpy(node->value, buffer); if (buffer[0] != '*') { node->left = read_tree(); node->right = read_tree(); } else { node->left = NULL; node->right = NULL; } return node; }; void free_tree(struct tree *tree) { if (tree == NULL) { return; } free_tree(tree->left); free_tree(tree->right); free(tree); } int count_leaf_nodes(struct tree *node) { if (node == NULL) { return 0; } if (node->left == NULL && node->right == NULL) { return 1; } return count_leaf_nodes(node->left) + count_leaf_nodes(node->right); } int count_non_leaf_nodes(struct tree *node) { if (node == NULL || (node->left == NULL && node->right == NULL)) { return 0; } return 1 + count_non_leaf_nodes(node->left) + count_non_leaf_nodes(node->right); } void interact(struct tree *node) { if (node == NULL) { return; } printf("%s\n", node->value); if (node->left == NULL && node->right == NULL) { printf("Koniec\n"); return; } char answer; while (scanf(" %c", &answer) == 1) { if (answer == 'a') { interact(node->left); return; } else if (answer == 'n') { interact(node->right); return; } else { printf("Odpovedajte 'a' alebo 'n'\n"); } } } int main() { struct tree *root = read_tree(); printf("Expert z bufetu to vie.\n"); printf("Pozna %d druhov ovocia a zeleniny.\n", count_leaf_nodes(root)); printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); if (root == NULL) { printf("Chyba pri nacitani databazy pravidiel.\n"); return 1; } interact(root); free_tree(root); return 0; }