Browse Source

now use the parent in element in delete

release0.1.5
Georg Hopp 12 years ago
parent
commit
e5fa68bf02
  1. 21
      src/binarytree.c

21
src/binarytree.c

@ -1,6 +1,9 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "../include/commons.h"
struct element struct element
{ {
int data; int data;
@ -103,13 +106,10 @@ findInOrderSuccessor(struct element * tree)
void void
deleteElement(struct element ** tree, int data) deleteElement(struct element ** tree, int data)
{ {
struct element * parent = NULL;
struct element * node = *tree; struct element * node = *tree;
// find the relevant node and it's parent // find the relevant node and it's parent
while (NULL != node && node->data != data) { while (NULL != node && node->data != data) {
parent = node;
if (data < node->data) { if (data < node->data) {
node = node->left; node = node->left;
} else { } else {
@ -130,29 +130,26 @@ deleteElement(struct element ** tree, int data)
struct element * successor = findInOrderSuccessor(node); struct element * successor = findInOrderSuccessor(node);
node->data = successor->data; node->data = successor->data;
parent = successor->parent;
node = successor; node = successor;
} }
// case 2: one child wither left or right // case 2: one child wither left or right
if (NULL != node->left) { if (NULL != node->left) {
node->data = node->left->data; node->data = node->left->data;
parent = node;
node = parent->left;
node = node->left;
} }
if (NULL != node->right) { if (NULL != node->right) {
node->data = node->right->data; node->data = node->right->data;
parent = node;
node = parent->right;
node = node->right;
} }
// case 3: we are a leaf // case 3: we are a leaf
if (NULL != parent) {
if (node == parent->left) {
parent->left = NULL;
if (NULL != node->parent) {
if (node == node->parent->left) {
node->parent->left = NULL;
} else { } else {
parent->right = NULL;
node->parent->right = NULL;
} }
} }

Loading…
Cancel
Save