void node_rotate_right(tree_t *tree, node_t *x) { //printf("@rotate-right %d\n", x->key); node_t *y; y = x->left; x->left = y->right; if (!is_nil(y->right)) parent(y->right) = x; parent(y) = parent(x); if (is_nil(parent(x))) { tree->root = y; } else { if (is_right_child(x)) parent(x)->right = y; else parent(x)->left = y; } y->right = x; parent(x) = y; }
void rb_tree_insert_repair(tree_t *tree, node_t *n) { // przypadek 1: korzeń if (is_nil(parent(n))) { n->color = BLACK; return; } // przypadek 2: rodzic czarny if (parent(n)->color == BLACK) return; // przypadek 3: rodzic czerwony; wuj czerwony; if (!is_nil(uncle(n)) && uncle(n)->color == RED) { parent(n)->color = BLACK; uncle(n)->color = BLACK; grandparent(n)->color = RED; rb_tree_insert_repair(tree, grandparent(n)); } else // przypadek 4: rodzic czerwony; wuj czarny; { if (is_right_child(n) && is_left_child(parent(n))) { node_rotate_left(tree, parent(n)); n = n->left; } else if (is_left_child(n) && is_right_child(parent(n))) { node_rotate_right(tree, parent(n)); n = n->right; } // case 5: wuj czarny; nowy, rodzic, dziadek na prostej; nowy i rodzic czerwoni; parent(n)->color = BLACK; grandparent(n)->color = RED; if (is_left_child(n) && is_left_child(parent(n))) node_rotate_right(tree, grandparent(n)); else node_rotate_left(tree, grandparent(n)); } }
Bit side() const { if (is_left_child()) { return Bit::zero; } else { assert(is_right_child()); return Bit::one; } }
pcNode* IntervalMap::get_prev_node(pcNode*now) { if (now->left) return get_max(now->left); else { while (now) { if (is_right_child(now)) return now->parent; else now = now->parent; } return 0; // Wir sind am Anfang angekommen } }
node_t* next(node_t* node) { node_t* next_node = node; if (!is_root(node)) { if (node->parent->right == NULL) { return node->parent; } while (is_right_child(next_node)) { next_node = next_node->parent; } } if (!is_root(next_node)) { next_node = next_node->parent->right; } while (!is_leaf(next_node)) { next_node = next_node->left; } return next_node; }
void rb_tree_delete_repair(tree_t *tree, node_t *n) { // przypadek 1: korzeń lub czerwony if (is_nil(parent(n)) || n->color == RED) return; // przypadek 2: if (sibling(n)->color == RED) { parent(n)->color = RED; sibling(n)->color = BLACK; if (is_left_child(n)) node_rotate_left(tree, parent(n)); else node_rotate_right(tree, parent(n)); } // przypadek 3: if (parent(n)->color == BLACK && sibling(n)->color == BLACK && sibling(n)->left->color == BLACK && sibling(n)->right->color == BLACK) { sibling(n)->color = RED; rb_tree_delete_repair(tree, parent(n)); return; } // przypadek 4: if (parent(n)->color == RED && sibling(n)->color == BLACK && sibling(n)->left->color == BLACK && sibling(n)->right->color == BLACK) { sibling(n)->color = RED; parent(n)->color = BLACK; return; } // przypadek 5 if (is_left_child(n) && sibling(n)->color == BLACK && sibling(n)->left->color == RED && sibling(n)->right->color == BLACK) { sibling(n)->color = RED; sibling(n)->left->color = BLACK; node_rotate_right(tree, sibling(n)); } else if (is_right_child(n) && sibling(n)->color == BLACK && sibling(n)->right->color == RED && sibling(n)->left->color == BLACK) { sibling(n)->color = RED; sibling(n)->right->color = BLACK; node_rotate_left(tree, sibling(n)); } // przypadek 6: sibling(n)->color = parent(n)->color; parent(n)->color = BLACK; if (is_left_child(n)) { sibling(n)->right->color = BLACK; node_rotate_left(tree, parent(n)); } else { sibling(n)->left->color = BLACK; node_rotate_right(tree, parent(n)); } }