From 3266c80841d1bff2ea3638b8133dcd24efe7d444 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Wed, 18 Jun 2014 08:28:56 +0100 Subject: [PATCH] some more optimizations by preventing NULL checks --- include/tr/tree.h | 6 +++--- src/tree/Makefile.am | 4 ++-- src/tree/insert.c | 36 +++++++++++++++++++----------------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/include/tr/tree.h b/include/tr/tree.h index cc6ea06..99f6a0b 100644 --- a/include/tr/tree.h +++ b/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; \ } diff --git a/src/tree/Makefile.am b/src/tree/Makefile.am index 7707edc..e28e6ed 100644 --- a/src/tree/Makefile.am +++ b/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/ diff --git a/src/tree/insert.c b/src/tree/insert.c index b3ef509..00a263e 100644 --- a/src/tree/insert.c +++ b/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;