Node *_delRedBlackTree(Node **rootPtr, Node *newNode, int (*compareNode)(void *data, void *object)){ Node *root = *rootPtr, *node , *successorNode; if(root == NULL) Throw(ERR_NODE_UNAVAIBLE); else if(compareNode(root->data, newNode->data) == 1) node = _delRedBlackTree( &root->right, newNode, compareNode); else if(compareNode(root->data, newNode->data) == -1) node = _delRedBlackTree( &root->left, newNode, compareNode); else{ if(root->left || root->right){ //Checking is the removeNode has childNode successorNode = removeNextLargerSuccessor(&(*rootPtr)->right); successorNode->left = (*rootPtr)->left; successorNode->right = (*rootPtr)->right; *rootPtr = successorNode; } else *rootPtr = NULL; return root; } caseSelect(&(*rootPtr)); return node; }
Node *_delRedBlackTree(Node **rootPtr, Node *newNode){ Node *root = *rootPtr, *node , *successorNode; if(root == NULL) Throw(ERR_NODE_UNAVAIBLE); if(root->data == newNode->data){ if(root->left || root->right){ //Checking is the removeNode has childNode successorNode = removeNextLargerSuccessor(&(*rootPtr)->right); successorNode->left = (*rootPtr)->left; successorNode->right = (*rootPtr)->right; *rootPtr = successorNode; } else *rootPtr = NULL; return root; } if(newNode->data > (*rootPtr)->data) node = _delRedBlackTree( &root->right, newNode); if(newNode->data < (*rootPtr)->data) node = _delRedBlackTree( &root->left, newNode); caseSelect(&(*rootPtr)); return node; }