Beispiel #1
0
/* Delete a node from the tree based on the key */
int opal_rb_tree_delete(opal_rb_tree_t *tree, void *key)
{
    opal_rb_tree_node_t * p;
    opal_rb_tree_node_t * todelete;
    opal_rb_tree_node_t * y;
    ompi_free_list_item_t * item;

    p = opal_rb_tree_find_node(tree, key);
    if (NULL == p) {
        return OPAL_ERR_NOT_FOUND;
    }
    if ((p->left == tree->nill) || (p->right == tree->nill)) {
        todelete = p;
    } else {
        todelete = btree_successor(tree, p);
    }

    if (todelete->left == tree->nill) {
        y = todelete->right;
    } else {
        y = todelete->left;
    }

    y->parent = todelete->parent;

    if (y->parent == tree->root_ptr) {
        tree->root_ptr->left = y;
    } else {
        if (todelete == todelete->parent->left) {
         todelete->parent->left = y;
        } else {
            todelete->parent->right = y;
        }
    }

    if (todelete != p) {
        p->key = todelete->key;
        p->value = todelete->value;
    }

    if (todelete->color == BLACK) {
        btree_delete_fixup(tree, y);
    }
    item = (ompi_free_list_item_t *) todelete;
    OMPI_FREE_LIST_RETURN_MT(&(tree->free_list), item);
    --tree->tree_size;
    return OPAL_SUCCESS;
}
Beispiel #2
0
int
btree_get_next_key(btree_t *tree, uint32_t cur_key, uint32_t *next_key)
{
    btree_node_t *x;

    btree_validate(tree);
    x = btree_search(tree->root, cur_key);
    if (x == NULL) {
        return FALSE;
    }

    x = btree_successor(x);
    if (x == NULL) {
        return FALSE;
    }

    *next_key = x->key;
    return TRUE;
}
Beispiel #3
0
int acl_btree_get_next_key(ACL_BTREE *tree,
	unsigned int cur_key, unsigned int *next_key)
{
	BTREE_NODE *x;

	btree_validate(tree);
	x = btree_search(tree->root, cur_key);
	if (x == NULL) {
		return (-1);
	}
        
	x = btree_successor(x);
	if (x == NULL) {
		return (-1);
	}
        
	*next_key = x->key;
	return (0);
}
Beispiel #4
0
static btree_node_t*
btree_delete_node(btree_t *tree, btree_node_t *z)
{
    btree_node_t *x, *y;

    btree_validate(tree);
    if (z->left == NULL || z->right == NULL) {
        y = z;
    } else {
        y = btree_successor(z);
    }

    if (y->left != NULL) {
        x = y->left;
    } else {
        x = y->right;
    }

    if (x != NULL) {
        x->parent = y->parent;
    }

    if (y->parent == NULL) {
        tree->root = x;
    } else if (y == y->parent->left) {
        y->parent->left = x;
    } else {
        y->parent->right = x;
    }

    z->key  = y->key;
    z->data = y->data;

    tree->count--;

    btree_validate(tree);
    return y;
}
Beispiel #5
0
static BTREE_NODE *btree_delete_node(ACL_BTREE *tree, BTREE_NODE *z)
{
	BTREE_NODE *x, *y;

	btree_validate(tree);
	if (z->left == NULL || z->right == NULL) {
		y = z;
	} else {
		y = btree_successor(z);
	}

	if (y->left != NULL) {
		x = y->left;
	} else {
		x = y->right;
	}

	if (x != NULL) {
		x->parent = y->parent;
	}

	if (y->parent == NULL) {
		tree->root = x;
	} else if (y == y->parent->left) {
		y->parent->left = x;
	} else {
		y->parent->right = x;
	}

	z->key  = y->key;
	z->data = y->data;

	tree->count--;

	btree_validate(tree);
	return (y);
}