Browse Source

some more optimizations by preventing NULL checks

1.0.0
Georg Hopp 12 years ago
parent
commit
3266c80841
  1. 6
      include/tr/tree.h
  2. 4
      src/tree/Makefile.am
  3. 36
      src/tree/insert.c

6
include/tr/tree.h

@ -70,8 +70,8 @@
TR_Tree _node = (node); \
TR_Tree relChild = TR_TREE_ROT_RELCHILD_##lr(_node); \
TR_Tree relChildLvl2 = TR_TREE_ROT_RELCHILD_##lr(_node)->lr; \
relChild->lr = _node; \
relChild->parent = _node->parent; \
relChild->lr = _node; \
relChild->parent = _node->parent; \
TR_TREE_ROT_RELCHILD_##lr(_node) = relChildLvl2; \
if (NULL != relChildLvl2) { \
relChildLvl2->parent = _node; \
@ -96,7 +96,7 @@ typedef enum {rbBlack=1, rbRed=2} TR_rbColor;
#define TR_TREE_NODE_STRICT_RED(node) (NULL != (node) && rbRed == (node)->color)
#define TR_TREE_INORDER_SUCC(node, succ) \
succ = TR_TREE_RIGHT((node)); \
succ = (node)->right; \
while (NULL != succ->left) { \
succ = succ->left; \
}

4
src/tree/Makefile.am

@ -4,8 +4,8 @@ AUTOMAKE_OPTIONS = subdir-objects
TREE = tree.c \
find.c \
insert.c \
inOrderSuccessor.c \
delete.c walk.c \
delete.c \
walk.c \
destroy.c
AM_CFLAGS += -I../../include/

36
src/tree/insert.c

@ -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;

Loading…
Cancel
Save