트리가
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 보시면 돼요........아우......... 뭐가 잘못된건지..................
아 안돌아가는건 아니고 막 34가 무한 양산됨요 ㅠㅠ