IntervalTreeNode * IntervalTree::Insert(Interval * newInterval) { IntervalTreeNode * y; IntervalTreeNode * x; IntervalTreeNode * newNode; x = new IntervalTreeNode(newInterval); TreeInsertHelp(x); FixUpMaxHigh(x->parent); newNode = x; x->red=1; while(x->parent->red) { /* use sentinel instead of checking for root */ if (x->parent == x->parent->parent->left) { y=x->parent->parent->right; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { if (x == x->parent->right) { x=x->parent; LeftRotate(x); } x->parent->red=0; x->parent->parent->red=1; RightRotate(x->parent->parent); } } else { /* case for x->parent == x->parent->parent->right */ /* this part is just like the section above with */ /* left and right interchanged */ y=x->parent->parent->left; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { if (x == x->parent->left) { x=x->parent; RightRotate(x); } x->parent->red=0; x->parent->parent->red=1; LeftRotate(x->parent->parent); } } } root->left->red=0; return(newNode); #ifdef CHECK_INTERVAL_TREE_ASSUMPTIONS CheckAssumptions(); #elif defined(DEBUG_ASSERT) Assert(!nil->red,"nil not red in ITTreeInsert"); Assert(!root->red,"root not red in ITTreeInsert"); Assert((nil->maxHigh=MIN_INT), "nil->maxHigh != MIN_INT in ITTreeInsert"); #endif }
IntervalTreeNode * IT_insert(IntervalTree *it, long low, long high, void *data) { IntervalTreeNode *x, *y, *newNode; x = ITN_create(low, high, data); TreeInsertHelp(it, x); FixUpMaxHigh(it, x->parent); newNode = x; x->red=1; while(x->parent->red) { /* use sentinel instead of checking for root */ if (x->parent == x->parent->parent->left) { y=x->parent->parent->right; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { if (x == x->parent->right) { x=x->parent; LeftRotate(it, x); } x->parent->red=0; x->parent->parent->red=1; RightRotate(it, x->parent->parent); } } else { /* case for x->parent == x->parent->parent->right */ /* this part is just like the section above with */ /* left and right interchanged */ y=x->parent->parent->left; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { if (x == x->parent->left) { x=x->parent; RightRotate(it, x); } x->parent->red=0; x->parent->parent->red=1; LeftRotate(it, x->parent->parent); } } } it->root->left->red=0; #ifdef CHECK_INTERVAL_TREE_ASSUMPTIONS IT_CheckAssumptions(it); #elif defined(DEBUG_ASSERT) Assert(!it->nil->red,"nil not red in ITTreeInsert"); Assert(!it->root->red,"root not red in ITTreeInsert"); Assert((it->nil->maxHigh=LONG_MIN), "nil->maxHigh != LONG_MIN in ITTreeInsert"); #endif return newNode; }
RBNODE RbTreeInsert (RBTREE tree, RBKEY key, RBVALUE info) { RBNODE y; RBNODE x; RBNODE newNode; ++tree->count; x=(RBNODE) SafeMalloc(sizeof(*x)); x->key=key; x->info=info; TreeInsertHelp(tree,x); newNode=x; x->red=1; while(x->parent->red) { /* use sentinel instead of checking for root */ if (x->parent == x->parent->parent->left) { y=x->parent->parent->right; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { if (x == x->parent->right) { x=x->parent; LeftRotate(tree,x); } x->parent->red=0; x->parent->parent->red=1; RightRotate(tree,x->parent->parent); } } else { /* case for x->parent == x->parent->parent->right */ y=x->parent->parent->left; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { if (x == x->parent->left) { x=x->parent; RightRotate(tree,x); } x->parent->red=0; x->parent->parent->red=1; LeftRotate(tree,x->parent->parent); } } } tree->root->left->red=0; return(newNode); #ifdef DEBUG_ASSERT Assert(!tree->nil->red,"nil not red in RbTreeInsert"); Assert(!tree->root->red,"root not red in RbTreeInsert"); #endif }
rb_red_blk_node * RBTreeInsert(rb_red_blk_tree* tree, void* key, void* info) { rb_red_blk_node * y; rb_red_blk_node * x; rb_red_blk_node * newNode; if (setjmp(rb_jbuf)) return NULL; x=(rb_red_blk_node*) SafeMalloc(sizeof(rb_red_blk_node)); x->key=key; x->info=info; TreeInsertHelp(tree,x); newNode=x; x->red=1; while(x->parent->red) { /* use sentinel instead of checking for root */ if (x->parent == x->parent->parent->left) { y=x->parent->parent->right; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { if (x == x->parent->right) { x=x->parent; LeftRotate(tree,x); } x->parent->red=0; x->parent->parent->red=1; RightRotate(tree,x->parent->parent); } } else { /* case for x->parent == x->parent->parent->right */ y=x->parent->parent->left; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { if (x == x->parent->left) { x=x->parent; RightRotate(tree,x); } x->parent->red=0; x->parent->parent->red=1; LeftRotate(tree,x->parent->parent); } } } tree->root->left->red=0; return(newNode); #ifdef DEBUG_ASSERT Assert(!tree->nil->red,"nil not red in RBTreeInsert"); Assert(!tree->root->red,"root not red in RBTreeInsert"); #endif }
void RBTree::RBTreeInsert(int key) { rb_red_blk_node * y; rb_red_blk_node * x; rb_red_blk_node * newNode; x=new rb_red_blk_node; x->key=key; TreeInsertHelp(x); newNode=x; x->red=1; while(x->parent->red) { if (x->parent == x->parent->parent->left) { y=x->parent->parent->right; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { /* XXX: original code was : if (x == x->parent->right) { */ if (x > x->parent->right) { x=x->parent; LeftRotate(x); } x->parent->red=0; x->parent->parent->red=1; RightRotate(x->parent->parent); } } else { y=x->parent->parent->left; if (y->red) { x->parent->red=0; y->red=0; x->parent->parent->red=1; x=x->parent->parent; } else { if (x == x->parent->left) { x=x->parent; RightRotate(x); } x->parent->red=0; x->parent->parent->red=1; LeftRotate(x->parent->parent); } } } tree->root->left->red=0; }