This commit is contained in:
2026-04-27 00:01:08 +02:00
parent 58308cc602
commit 4a208a7527
7 changed files with 150 additions and 17 deletions
+124 -6
View File
@@ -1,6 +1,8 @@
#include "basic_tree.h"
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <time.h>
// FCTs perso
struct queue *enqueue(struct queue *queue, struct node *node){
@@ -52,6 +54,15 @@ void queue_destroy(struct queue *queue){
}
}
void delete_tree(struct node *root){
if(!root) return;
delete_tree(root->left);
delete_tree(root->right);
free(root);
}
int find(struct node *root, int value){
// -1 : erreur, 0 : pas de leaf/node, x>0 : nombre trouvé
@@ -79,9 +90,6 @@ int find(struct node *root, int value){
free (queue);
return found;
}
@@ -166,17 +174,127 @@ void delete_leaf(struct node *root, int value){
}
struct node *delete_node(struct node *root, int value);
struct node *delete_node(struct node *root, int value){
void pretty_print(struct node *root);
if(!root) return NULL;
// 3 cas : 1 si le node a un child, 2 si le node a deux nodes, 3 si il en a pas
// Si il a pas de child
if(!root->left && !root->right){
if(root->value == value){
free(root);
return NULL;
}
return root;
}
struct node *targ = NULL;
struct node *prec_child = NULL;
struct node *prec_dad = NULL;
struct queue *queue = enqueue(NULL, root);
while(queue != NULL){
struct node *tmp = dequeue(&queue);
if (tmp->value == value && !targ) targ = tmp;
if(tmp->left){
prec_dad = tmp;
queue = enqueue(queue, tmp->left);
prec_child = tmp->left;
}
if(tmp->right){
prec_dad = tmp;
queue = enqueue(queue, tmp->right);
prec_child = tmp->right;
}
}
if(targ){
targ->value = prec_child->value;
if(prec_dad->right == prec_child) prec_dad->right = NULL;
else prec_dad->left = NULL;
free(prec_child);
}
return root;
}
void pretty_print(struct node *root){
if(!root) return;
struct queue *queue = enqueue(NULL, root);
int index_l = 1;
int index_n = 0;
while(queue){
struct node *tmp = dequeue(&queue);
index_l--;
printf("%d", tmp->value);
if(tmp->left){
queue = enqueue(queue, tmp->left);
index_n++;
}
if(tmp->right){
queue = enqueue(queue, tmp->right);
index_n++;
}
if(index_l > 0) printf("\t");
else{
printf("\n");
index_l = index_n;
index_n = 0;
}
}
}
int main(int argc, char *argv[]) {
if (argc == 1)
return 1;
struct node *root = NULL;
for (int i = 1; i < argc; i++) {
root = insert(root, atoi(argv[i]));
}
pretty_print(root);
delete_tree(root);
return 0;
}
/*
int main() {
struct node *root = insert(NULL, 0);
root = insert(root, 1);
root = insert(root, 2);
root = delete_node(root, 0);
printf("%d, %d\n", root->value, root->left->value); // 2, 1
}
*/
/*
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
}
}i*/
/*