diff --git a/.gitignore b/.gitignore index 2b29547..4c4e093 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,12 @@ *.gz *.html +*.a +*.lib +*.o +*.obj +*.out + +.idea/ +*~ +*.DotSettings.user + diff --git a/README b/README index 6d67682..0540dc0 100644 --- a/README +++ b/README @@ -1,3 +1,5 @@ +Voici une petite image de Lola <3 + /9j/4Qk4RXhpZgAATU0AKgAAAAgACwEPAAIAAAAGAAAAkgEQAAIAAAAbAAAAmAESAAMAAAABAAYA AAEaAAUAAAABAAAAtAEbAAUAAAABAAAAvAEoAAMAAAABAAIAAAExAAIAAAAFAAAAxAEyAAIAAAAU AAAAygE8AAIAAAAbAAAA3gITAAMAAAABAAEAAIdpAAQAAAABAAAA+gAAAABBcHBsZQBpUGhvbmUg diff --git a/The-Nook-GamesTM/Fundamentals/basic_tree.c b/The-Nook-GamesTM/Fundamentals/basic_tree.c index 5f2c595..3d0c583 100644 --- a/The-Nook-GamesTM/Fundamentals/basic_tree.c +++ b/The-Nook-GamesTM/Fundamentals/basic_tree.c @@ -1,9 +1,190 @@ #include "basic_tree.h" +#include +#include +// FCTs perso -struct node *insert(struct node *root, int value); +struct queue *enqueue(struct queue *queue, struct node *node){ -void delete_leaf(struct node *root, int value); + //if (!queue || !node) return NULL; + //struct queue *tmp = queue; + // ajout en fin + //while(tmp){ + // tmp = tmp->next; + //} + + struct queue *new_queue = malloc(sizeof(struct queue)); + if(!new_queue)return NULL; + + new_queue->node = node; + new_queue->next = NULL; + + if(!queue) return new_queue; + + struct queue *tmp = queue; + + while(tmp->next) tmp = tmp->next; + + tmp->next = new_queue; + + return queue; +} + +struct node *dequeue(struct queue **queue){ + + if(!queue || !*queue) return NULL; + + // On suppr la head + struct queue *tmp = *queue; + struct node *node = tmp->node; + *queue = tmp->next; + free(tmp); + + return node; +} + +void queue_destroy(struct queue *queue){ + + while(queue){ + struct queue *tmp = queue; + queue = queue->next; + free(tmp); + } +} + +int find(struct node *root, int value){ + + // -1 : erreur, 0 : pas de leaf/node, x>0 : nombre trouvé + if(!root)return -1; + + int found = 0; + struct queue *queue = enqueue(NULL, root); + + while(queue != NULL){ + + struct node *tmp = dequeue(&queue); + + //si tmp est une leaf + if(!tmp->left && !tmp->right) { + if(tmp->value == value) found ++; + } + else { + + if(tmp->value == value) found ++; + queue = enqueue(queue, tmp->left); + queue = enqueue(queue, tmp->right); + } + } + + free (queue); + return found; + + + + +} + + +//################################################################# +// FCTs sujet + +struct node *insert(struct node *root, int value){ + + // Parcours largeur + + struct node *node = malloc(sizeof(struct node)); + if(!node) return NULL; + + node->value = value; + node->left = NULL; + node->right = NULL; + + if (!root) return node; + else{ + + struct queue *queue = enqueue(NULL ,root); + + while(queue != NULL){ + + struct node *tmp = dequeue(&queue); + + if(tmp->left == NULL) { + tmp->left = node; + queue_destroy(queue); + break; + } + else if (tmp->right == NULL) { + tmp->right = node; + queue_destroy(queue); + break; + } + else{ + + queue = enqueue(queue, tmp->left); + queue = enqueue(queue, tmp->right); + } + + } + + } + return root; +} + +void delete_leaf(struct node *root, int value){ + + if(!root || !value) return; + + + if(root->left){ + + // On regarde si c'est un noeud + if(root->left || root->right){ + + // On regarde si c'est une leaf + if(!root->left->left && !root->left->right && root->left->value == value){ + free(root->left); + root->left = NULL; + } + else delete_leaf(root->left, value); + } + } + + if(root->right){ + + // On regarde si c'est un noeud + + if(root->left || root->right){ + + // On regarde si c'est une leaf + if(!root->right->left && !root->right->right && root->right->value == value){ + free(root->right); + root->right = NULL; + } + else delete_leaf(root->right, value); + } + } + +} + struct node *delete_node(struct node *root, int value); -void pretty_print(struct node *root); \ No newline at end of file +void pretty_print(struct node *root); + +int main() { + struct node *root = insert(NULL, 0); + root = insert(root, 1); + root = insert(root, 2); + delete_leaf(root, 2); + printf("%d, %d\n", root->value, root->left->value); // 0, 1 +} + + +/* +int main() { + struct node *root = insert(NULL, 0); + root = insert(root, 1); + root = insert(root, 2); + printf("%d, %d, %d\n", root->value, root->left->value, root->right->value); // 0, 1, 2 + +} +*/