Beispiel #1
0
void RBTree_insert_fixup(tree_t *T, treenode_t *z) {
    treenode_t *y = gNil;

    while (z->parent->color == RED) {
        if (DEBUG) {
            printf (" z = %ld, z->parent->key = %ld\n", z->key, z->parent->key);
        }
        if (z->parent == z->parent->parent->left_child) {
            y = z->parent->parent->right_child;
            if (y->color == RED) { // case 1
                if (DEBUG) printf("case 1\n");
                z->parent->color = BLACK;
                y->color = BLACK;
                z->parent->parent->color = RED;
                z = z->parent->parent;
            } else {
                if (z == z->parent->right_child) { // case 2
                    if (DEBUG) printf("case 2\n");
                    z = z->parent;
                    tree_left_rotate(T, z);
                }
                if (DEBUG) printf("case 3\n");
                z->parent->color = BLACK;                // case 3
                z->parent->parent->color = RED;          // case 3
                tree_right_rotate(T, z->parent->parent); // case 3
            }
        } else {
            y = z->parent->parent->left_child;
            if (y->color == RED) { // case 4
                if (DEBUG) printf("case 4\n");
                z->parent->color = BLACK;
                y->color = BLACK;
                z->parent->parent->color = RED;
                z = z->parent->parent;
            } else {
                if (z == z->parent->left_child) { // case 5
                    if (DEBUG) printf("case 5\n");
                    z = z->parent;
                    tree_right_rotate(T, z);
                }
                if (DEBUG) printf("case 6\n");
                z->parent->color = BLACK;                // case 6
                z->parent->parent->color = RED;          // case 6
                tree_left_rotate(T, z->parent->parent); // case 6
            }
        }
    }
    T->root->color = BLACK;
}
Beispiel #2
0
void testBSTree() {

    printf("\nNow is Create Binary tree with node size %d >>>>>>>>>>\n", ARRAY_SIZE);
    randomize_in_place(A, ARRAY_SIZE);
    //    randomize_maxnum(A, ARRAY_SIZE, ARRAY_SIZE);
    print_array(A, ARRAY_SIZE);

    startProfileTime();
    tree_t * tree = tree_create(A, ARRAY_SIZE);
    endProfileTime("Create Binary search tree ");

#if 0
    printf("\nPre order traverse:\n");
    tree_preorder_traverse(tree->root, my_treenode_key_traverse);

    printf("\nPost order traverse:\n");
    tree_postorder_traverse(tree->root, my_treenode_key_traverse);

    printf("\nIn order traverse:\n");
    tree_inorder_traverse(tree->root, my_treenode_key_traverse);
#endif

    int key = 50;
    startProfileTime();

    treenode_t * search_result = tree_search(tree->root, key);
    endProfileTime("Binary tree search");
    
    if (search_result != get_nil_node()) {
        printf("Found key:%d\n", key);
    } else {
        printf(" Not found key:%d\n", key);
    }
    
    tree_left_rotate(tree, search_result);
    tree_right_rotate(tree, search_result);

    traverse_no_recurise(tree->root, my_treenode_key_traverse);

    treenode_t * max, * min;
    max = tree_max(tree->root);
    min = tree_min(tree->root);
    printf("\nmax = %ld\n min = %ld\n", max->key, min->key);

    treenode_t * bigger = tree_successor(search_result);
    printf("successor = %ld\n", (bigger!=NULL) ? bigger->key : -1);
    treenode_t * smaller = tree_predecessor(search_result);
    printf("perdecessor = %ld\n", (smaller!=NULL) ? smaller->key : -1);
    
    //Test delete:
        treenode_t * deleted_node = RBTree_delete(tree, search_result);
        //    treenode_t * deleted_node = tree_delete(tree, search_result);
    if (deleted_node)
        printf("del %p, key=%ld from tree.\n", deleted_node, deleted_node->key);
    tree_inorder_traverse(tree->root, my_treenode_key_traverse);
    //    traverse_no_recurise(tree->root, my_treenode_key_traverse);
    
    int height = get_tree_height(tree->root);
    printf("\nget tree h = %d\n", height);
 
    tree_destroy(tree, NULL);
}
Beispiel #3
0
void RBTree_delete_fixup(tree_t *T, treenode_t *x) {
    treenode_t * w = gNil;

    while (x != T->root && x->color == BLACK) {
        if (x == x->parent->left_child) {
            w = x->parent->right_child;
            
            if (w->color == RED) {
                //case 1
                w->color = BLACK;
                tree_left_rotate(T, x->parent);
                w = x->parent->right_child;
            }
            if (w->left_child->color == BLACK && w->right_child->color == BLACK) {
                //case 2
                w->color = RED;
                x = x->parent;
            } else {
                if ( w->right_child->color == BLACK) { //w->left_child->color == RED
                    //case 3
                    w->left_child->color = BLACK;
                    w->color= RED;
                    tree_right_rotate(T, w);
                    w=x->parent->right_child; // update new w
                }
                //case 4
                w->color = x->parent->color;
                x->parent->color = BLACK;
                w->right_child->color = BLACK;
                tree_left_rotate(T, x->parent);
                x = T->root;
            }

        } else { // x == x->parent->right_child
            w = x->parent->left_child;
            
            if (w->color == RED) {
                //case 5
                w->color = BLACK;
                tree_right_rotate(T, x->parent);
                w = x->parent->left_child;
            }
            if (w->right_child->color == BLACK && w->left_child->color == BLACK) {
                //case 2
                w->color = RED;
                x = x->parent;
            } else {
                if ( w->left_child->color == BLACK) { //w->right_child->color == RED
                    //case 3
                    w->right_child->color = BLACK;
                    w->color= RED;
                    tree_left_rotate(T, w);
                    w=x->parent->left_child; // update new w
                }
                //case 4
                w->color = x->parent->color;
                x->parent->color = BLACK;
                w->left_child->color = BLACK;
                tree_right_rotate(T, x->parent);
                x = T->root;
            }
        }
        x->color = BLACK;
    }
}