From 1f40d1bc4bec67edc2a80d60c30603176586894f Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Fri, 23 Aug 2013 01:15:37 +0100 Subject: [PATCH] alternative approach on delete of single child nodes. This one really exchanges the nodes, thus preventing large copy on big data that might be in the tree...anyway, for small data i think the other approach is faster. --- src/binarytree.c | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/src/binarytree.c b/src/binarytree.c index 84c5dfb..fa0bbfd 100644 --- a/src/binarytree.c +++ b/src/binarytree.c @@ -135,13 +135,29 @@ deleteElement(struct element ** tree, int data) // case 2: one child wither left or right if (NULL != node->left) { - node->data = node->left->data; - node = node->left; + //node->data = node->left->data; + //node = node->left; + if (NULL != node->parent) { + if (node == node->parent->left) { + node->parent->left = node->left; + } else { + node->parent->right = node->left; + } + } + node->left->parent = node->parent; } if (NULL != node->right) { - node->data = node->right->data; - node = node->right; + //node->data = node->right->data; + //node = node->right; + if (NULL != node->parent) { + if (node == node->parent->left) { + node->parent->left = node->right; + } else { + node->parent->right = node->right; + } + } + node->right->parent = node->parent; } // case 3: we are a leaf @@ -153,10 +169,17 @@ deleteElement(struct element ** tree, int data) } } - free(node); if (node == *tree) { - *tree = NULL; + if (NULL != node->left) { + *tree = node->left; + } else if (NULL != node->right) { + *tree = node->right; + } else { + *tree = NULL; + } } + + free(node); } @@ -178,7 +201,7 @@ traverse(struct element * tree, void (*cb)(int, int)) node = node->right; depth++; } else { - if (node->parent->right == node) { + if (NULL == node->parent || node->parent->right == node) { break; } @@ -254,6 +277,10 @@ main(int argc, char * argv[]) printf("5: 0x%p\n", findElement(root, 5)); printf("6: 0x%p\n\n", findElement(root, 6)); + puts("traverse"); + traverse(root, printElement); + puts("\n"); + puts("delete 6 (one child on the left):"); deleteElement(&root, 6); printf("R: 0x%p\n", root);