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);