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;
}
Example #2
0
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;
}