/**
 * 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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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);
}