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; }
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); }
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; } }