Browse Source

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.

release0.1.5
Georg Hopp 12 years ago
parent
commit
1f40d1bc4b
  1. 39
      src/binarytree.c

39
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) {
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);

Loading…
Cancel
Save