コード例 #1
0
ファイル: rb_tree.c プロジェクト: aviramc/opex2
static void rb_tree_delete(rb_tree_t *tree, rb_tree_node_t *z)
{
    rb_tree_node_t *y = NULL;
    rb_tree_node_t *x = NULL;

    if (IS_NIL(tree, z->left) || IS_NIL(tree, z->right)) {
        y = z;
    } else {
        y = rb_tree_successor(tree, z);
    }

    if (IS_NIL(tree, y->left)) {
        x = y->right;
    } else {
        x = y->left;
    }

    x->parent = y->parent;

    if (IS_NIL(tree, y->parent)) {
        tree->head = x;
    } else {
        if (y == y->parent->left) {
            y->parent->left = x;
        } else {
            y->parent->right = x;
        }
    }

    if (y != z) {
        /* z->left = y->left; */
        /* z->right = y->right; */
        /* z->parent = y->parent; */
        /* z->color = y->color; */
        z->key = y->key;
        z->count = y->count;
    }

    if (y->color == BLACK) {
        rb_tree_delete_fixup(tree, x);
    }

    free(y);
}
コード例 #2
0
void rb_tree_delete (RBTREE *T , NODE *z) {  
    NODE *y = z;  
    NODE *x;  
    int y_original_color = y->color;  

    if (z->left == T->nil) {  
        x = z->right;  
        transplant (T , z , z->right);  
        free (z);  
    }else if (z->right == T->nil) {  
        x = z->right;  
        transplant (T , z , z->left);  
        free (z);  
    }else  {  
        y = minimum_rb_tree (T , z->right);  
        y_original_color = y->color;  
        x = y->right;  
    if (y->parent == z) {  
        x->parent = y;  
        transplant (T , z , y);  
        y->left = z->left;  
        z->left->parent = y;  
        y->color = z->color;  
        free (z);  
    }else {  
        transplant (T , y , y->right);  
        y->right = z->right;  
        y->right->parent = y;  
        transplant (T , z , y);  
        y->left = z->left;  
        y->left->parent = y;  
        y->color = z->color;  
        free (z);  
        }  
    }  
    if (y_original_color == BLACK)  
    rb_tree_delete_fixup (T , x);  
}