|
|
|
@ -93,43 +93,45 @@ TR_treeInsert(TR_Tree * this, const void * search, TR_TreeComp comp) |
|
|
|
} |
|
|
|
|
|
|
|
// case 2 |
|
|
|
if (rbBlack == TR_TREE_PARENT(node)->color) { |
|
|
|
if (rbBlack == node->parent->color) { |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
// case 3 |
|
|
|
if (NULL != TR_TREE_UNCLE(node) && rbRed == TR_TREE_UNCLE(node)->color) { |
|
|
|
TR_TREE_PARENT(node)->color = rbBlack; |
|
|
|
TR_TREE_UNCLE(node)->color = rbBlack; |
|
|
|
TR_TREE_GRANDPARENT(node)->color = rbRed; |
|
|
|
TR_Tree uncle = TR_TREE_UNCLE(node); |
|
|
|
|
|
|
|
node = TR_TREE_GRANDPARENT(node); |
|
|
|
if (NULL != uncle && rbRed == uncle->color) { |
|
|
|
node->parent->color = rbBlack; |
|
|
|
uncle->color = rbBlack; |
|
|
|
node->parent->parent->color = rbRed; |
|
|
|
|
|
|
|
node = node->parent->parent; |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
// case 4 |
|
|
|
if (node == TR_TREE_PARENT(node)->right |
|
|
|
&& TR_TREE_PARENT(node) == TR_TREE_GRANDPARENT(node)->left) { |
|
|
|
if (node == node->parent->right |
|
|
|
&& node->parent == node->parent->parent->left) { |
|
|
|
|
|
|
|
TR_TREE_ROTATE(left, this, TR_TREE_PARENT(node)); |
|
|
|
TR_TREE_ROTATE(left, this, node->parent); |
|
|
|
node = TR_TREE_LEFT(node); |
|
|
|
|
|
|
|
} else if (node == TR_TREE_PARENT(node)->left |
|
|
|
&& TR_TREE_PARENT(node) == TR_TREE_GRANDPARENT(node)->right) { |
|
|
|
} else if (node == node->parent->left |
|
|
|
&& node->parent == node->parent->parent->right) { |
|
|
|
|
|
|
|
TR_TREE_ROTATE(right, this, TR_TREE_PARENT(node)); |
|
|
|
TR_TREE_ROTATE(right, this, node->parent); |
|
|
|
node = TR_TREE_RIGHT(node); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// case 5 |
|
|
|
TR_TREE_PARENT(node)->color = rbBlack; |
|
|
|
TR_TREE_GRANDPARENT(node)->color = rbRed; |
|
|
|
node->parent->color = rbBlack; |
|
|
|
node->parent->parent->color = rbRed; |
|
|
|
|
|
|
|
if (node == TR_TREE_PARENT(node)->left) { |
|
|
|
TR_TREE_ROTATE(right, this, TR_TREE_GRANDPARENT(node)); |
|
|
|
if (node == node->parent->left) { |
|
|
|
TR_TREE_ROTATE(right, this, node->parent->parent); |
|
|
|
} else { |
|
|
|
TR_TREE_ROTATE(left, this, TR_TREE_GRANDPARENT(node)); |
|
|
|
TR_TREE_ROTATE(left, this, node->parent->parent); |
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|