트리가

        30
     20   40
  10     24   46 
6  14  22 

이렇게 있는데 

void deleteNode(int key)
{
 Node *delnode = NULL;//삭제노드 가리킬 포인터
 Node *parent = NULL;
 Node *child = NULL;

 Node *pPredecessor = NULL;
 Node *pSuccessor = NULL;

 delnode = RootNode;
 parent = NULL;
 while(delnode != NULL)
 {
  if(key == delnode->data)
   break;
  parent = delnode;
  if(delnode->data > key)
  {
   if(delnode->LeftChild != NULL)
    delnode = delnode->LeftChild;
  }
  else
  {
   if(delnode->RightChild != NULL)
    delnode = delnode->RightChild;
  }
 }
 if(delnode->LeftChild == NULL && delnode->RightChild == NULL)
 {
  if(parent != NULL)
  {
   if(parent->LeftChild == delnode)
    parent->LeftChild = NULL;
   else
    parent->RightChild = NULL;
  }
  else
   RootNode = NULL;
 }
 else if(delnode->LeftChild != NULL && delnode->RightChild != NULL)
 {
  pPredecessor = delnode;
  pSuccessor = delnode->LeftChild;
  while(pSuccessor->RightChild != NULL)
  {
   pPredecessor = pSuccessor;
   pSuccessor = pSuccessor->RightChild;
  }

  pPredecessor->RightChild = pSuccessor->LeftChild;
  pSuccessor->LeftChild = delnode->LeftChild;
  pSuccessor->RightChild = delnode->RightChild;

  if(parent != NULL)
  {
   if(parent->LeftChild == delnode)
   {
    parent->LeftChild = pSuccessor;
   }
   else
   {
    parent->RightChild = pSuccessor;
   }
  }
  else
  {
   RootNode = pSuccessor;
  }
 }
 else
 {
  if(delnode->LeftChild != NULL)
  {
   child = delnode->LeftChild;
  }
  else
  {
   child = delnode->RightChild;
  }

  if(parent != NULL)
  {
   if(parent->LeftChild == delnode)
   {
    parent->LeftChild = child;;
   }
   else
   {
    parent->RightChild = child;
   }
  }
  else
  {
   RootNode = child;
  }
 }
 free(delnode);
}

이 삭제연산으로 40이 삭제 가능한가요???? 생각으로 해도 안되고 실제로 돌아가지도 않는데....   
자식이 2개 있는거 삭제하는건 마지막 else if 보시면 돼요........아우......... 뭐가 잘못된건지..................