diff --git a/binary_tree b/binary_tree
index 026db06d534c63be0792ab7fabd71f52e6397b0b..75c5bbd1d29eb7cfc2a5c85146ca2153c82a2614 100755
Binary files a/binary_tree and b/binary_tree differ
diff --git a/binary_tree_lib.c b/binary_tree_lib.c
index dd0a337bbbfaf3d834ad0cba34b647f09fa0470a..eeb10a9dcd16ee2e8b870a61c3a15eda3eb71096 100644
--- a/binary_tree_lib.c
+++ b/binary_tree_lib.c
@@ -72,17 +72,38 @@ node_t *bst_insert(node_t *tree, int val){
     
 }
 
+bool bst_is_empty(node_t *tree){
+    return NULL==tree;
+}
+
 // efface le premier élément contenant la valeur val dans l'arbre
 // et retourne l'arbre (ne fait rien si val est absente)
 node_t *bst_delete(node_t *tree, int val){
-    if(val<tree->val){
-        bst_delete(tree->left, val);
-    }
-    else if(val>tree->val){
-        bst_delete(tree->right, val);
-    }
-    if(val==tree->val){
-        bst_destroy(tree);        
+    if(!bst_is_empty(tree)){
+        if(val>tree->val){
+            tree->right=bst_delete(tree->right, val);
+        }
+        else if(val<tree->val){
+            tree->left =bst_delete(tree->left, val);
+        }
+        else if(tree->left!=NULL&&tree->right!=NULL){
+            node_t * next= bst_find_max_node(tree->right);
+            tree->val=next->val;
+            tree->right=bst_delete(next, next->val);
+        }
+        else{
+            node_t* tmp=tree;
+            if(tmp->left!=NULL){
+                tree=tree->left;
+            }
+            else if(tmp->right!=NULL){
+                tree=tree->right;
+            }
+            else{
+                tree=NULL;
+            }
+            free(tmp);
+        }        
     }
     return tree;
 }
diff --git a/binary_tree_lib.h b/binary_tree_lib.h
index 4a3f6c46a24d1ba31042f43d1e3e5c31d3dc4ffc..c147976c2079c7edf631a0f410d19a65589cd2ad 100644
--- a/binary_tree_lib.h
+++ b/binary_tree_lib.h
@@ -14,6 +14,7 @@ struct _node_t *right;
 node_t *bst_create();
 node_t *bst_create_node(int val);
 void bst_destroy(node_t *tree);
+bool bst_is_empty(node_t *tree);
 void bst_print(node_t *tree, int prof);
 node_t *bst_insert(node_t *tree, int val);
 node_t *bst_delete(node_t *tree, int val);