136 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include <stdlib.h>
 | |
| #include <assert.h>
 | |
| 
 | |
| struct tree {
 | |
|     char value[50];
 | |
|     struct tree* left;
 | |
|     struct tree* right;
 | |
| };
 | |
| 
 | |
| 
 | |
| struct tree* read_tree(){
 | |
|     char buffer[50];
 | |
|     memset(buffer,0,50);
 | |
|     char* r = fgets(buffer,50,stdin);
 | |
|     int x = strlen(buffer);
 | |
|     buffer[x-1]='\0'; 
 | |
|     
 | |
|     assert(r);
 | |
|     
 | |
|     if(buffer[0] != '\0'){
 | |
|         struct tree* node = calloc(1,sizeof(struct tree));
 | |
|         memcpy(node->value, buffer,50);
 | |
|         if(buffer[0] != '*'){ 
 | |
|             if(node->left == NULL){
 | |
|                 node->left = read_tree();   
 | |
|             }
 | |
|             if(node->right == NULL){    
 | |
|                 node->right = read_tree();
 | |
|             }
 | |
|         }
 | |
|         return node;
 | |
|     }
 | |
| 
 | |
| }
 | |
| void search(struct tree* this){
 | |
|      
 | |
|     char buffer[5];
 | |
|     memset(buffer,0,5);
 | |
|     char* r = fgets(buffer,5,stdin);
 | |
|     int x = strlen(buffer);
 | |
|     buffer[x-1]='\0';
 | |
| 
 | |
|         if(buffer[0] == '\n'){
 | |
|             return;
 | |
|         } 
 | |
|         if(buffer[0] == 'a'){
 | |
|             if(this->left->value[0] == '*'){
 | |
|                 printf("%s\n", this->left->value);
 | |
|                 return;
 | |
|             }
 | |
|             printf("%s\n", this->left->value);
 | |
|             search(this->left);
 | |
| 
 | |
|         }
 | |
|  
 | |
|         else if(buffer[0] == 'n'){ 
 | |
|             if(this->right->value[0] == '*'){
 | |
|                 printf("%s\n", this->right->value);
 | |
|                 return;
 | |
|             }
 | |
|             printf("%s\n", this->right->value);
 | |
|             search(this->right);
 | |
| 
 | |
|         } 
 | |
| }
 | |
| 
 | |
| 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 == NULL) return;
 | |
|     
 | |
|     destroy_tree(root->left);
 | |
|     destroy_tree(root->right);   
 | |
|     free(root);
 | |
|     root = NULL;
 | |
| }
 | |
| int count_leaves(struct tree* node){
 | |
|     int count = 0;
 | |
|     if(node->left == NULL && node->right == NULL){
 | |
|         count = 1;
 | |
|     } 
 | |
|     else{
 | |
|         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 = 1;
 | |
|     if(node->left != NULL){
 | |
|         count += count_all(node->left);
 | |
|     }
 | |
|     if(node->right != NULL){
 | |
|         count += count_all(node->right);
 | |
|     }
 | |
|     return count;
 | |
| }
 | |
| 
 | |
| 
 | |
| int main(){
 | |
|     struct tree* tree = NULL;
 | |
|     tree = read_tree();
 | |
|     int count = count_leaves(tree);
 | |
|   
 | |
|     printf("Expert z bufetu to vie.\n");
 | |
|     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);
 | |
|     printf("Koniec\n");     
 | |
|     return 0;
 | |
| }
 | |
| 
 |