/** * binary_tree_delete - deletes an entire binary tree * @tree: binary tree to delete * Return: nothing */ void binary_tree_delete(binary_tree_t *tree) { if (tree == NULL) return; binary_tree_delete(tree->right); binary_tree_delete(tree->left); free(tree); }
int bus_detatch(struct bus_t *self_p, struct bus_listener_t *listener_p) { ASSERTN(self_p != NULL, EINVAL); ASSERTN(listener_p != NULL, EINVAL); int res = 0; struct bus_listener_t *head_p, *curr_p, *prev_p; rwlock_writer_take(&self_p->rwlock); head_p = (struct bus_listener_t *)binary_tree_search( &self_p->listeners, listener_p->id); if (head_p == NULL) { res = -1; } else if (head_p == listener_p) { res = binary_tree_delete(&self_p->listeners, listener_p->id); if (listener_p->next_p != NULL) { binary_tree_insert(&self_p->listeners, &listener_p->next_p->base); } } else { curr_p = head_p->next_p; prev_p = head_p; res = -1; while (curr_p != NULL) { if (curr_p == listener_p) { prev_p->next_p = listener_p->next_p; res = 0; break; } prev_p = curr_p; curr_p = curr_p->next_p; } } rwlock_writer_give(&self_p->rwlock); return (res); }
static void rb_delete(qrb_tree *tree_p, qrb_node *n_p ) { qrb_node *c_p; // the single non-leaf child qrb_node *parent; tree_p->node_count --; if( tree_p->node_count == 0 ){ assert( IS_ROOT_NODE(n_p) ); givbuf(n_p); tree_p->root = NULL; return; } if( n_p->left != NULL && n_p->right != NULL ){ //fprintf(stderr,"before calling binary_tree_delete:\n"); //dump_rb_node(n_p); n_p = binary_tree_delete(n_p); //fprintf(stderr,"after calling binary_tree_delete:\n"); //dump_rb_node(n_p); } else if( IS_ROOT_NODE(n_p) ){ // we are deleting a root node with only one child if( n_p->left != NULL ){ set_root_node(tree_p,n_p->left); } else { set_root_node(tree_p,n_p->right); } givbuf(n_p); return; } assert( n_p->left == NULL || n_p->right == NULL ); if( n_p->left != NULL ) c_p = n_p->left; else c_p = n_p->right; // may be NULL // if c_p is null, then we need to keep a reference to the parent... parent=n_p->parent; replace_node(tree_p,n_p,c_p); if( IS_RED(n_p) ){ givbuf(n_p); return; } // Now we can free n_p givbuf(n_p); if( IS_RED(c_p) ){ MAKE_BLACK(c_p); return; } // Now we know the node in question is black and has no red child //assert( n_p->left != NULL && n_p->right != NULL ); // Now we know that both n_p and c_p are black rebalance(tree_p,c_p,parent); }