현재 재귀를 사용하여 수행중인 찾기 및 제거 기능을 수정하려고합니다. 그러나 케이스 2가 끝나면 케이스 0 또는 케이스 1로 연결되는지 식별하는 방법에 대해 문제가 있습니다.이진 검색 트리 찾기 및 제거 [C++]
다음은 내가 수행하려고 시도하는 간단한 설명입니다. 사례 2 (두 자녀) - 오른쪽 하위 트리를 최소로 바꾸면 대소 문자가 구분됩니다. the algorithm에 따르면
bool findAndRemove(const Type& v)
{
return findAndRemove(root, nullptr, v);
}
bool findAndRemove(Node<Type> *fr, Node<Type> *parent, const Type& v) const
{
if (fr == nullptr)
{
return true;
}
if (v < fr->element)
{
return findAndRemove(fr->left, fr, v);
}
else if (v > fr->element)
{
return findAndRemove(fr->right, fr, v);
}
else
{
switch (GetChildren(fr))
{
case 0:
if (parent->left == fr)
{
parent->left = nullptr;
delete fr;
}
else
{
parent->right = nullptr;
delete fr;
}
break;
case 1:
if (parent->left == fr)
{
if (fr->left != nullptr)
{
parent->left = fr->left;
delete fr;
}
else
{
parent->left = fr->right;
}
}
else
{
if (fr->right != nullptr)
{
parent->right = fr->right;
delete fr;
}
else
{
parent->right = fr->left;
}
}
break;
case 2:
{
Node<Type> * swap = fr->right;
while (swap->left != nullptr)
{
swap = swap->left;
}
Type temp = fr->element; // 30
temp = swap->element; // 35
swap->element = fr->element; // 30
fr->element = temp;
//temp = swap->element;
//swap->element = temp;
//temp = fr->element;
break;
}
}
}
return false;
}
'swap'에는 왼쪽 자식이 없습니다. 그것에는 0 명의 아이들이 있습니다 * iff * 그것은 올바른 아이가 없습니다. 그것은 아이가 1 명 * iff * 아이가 있습니다. 하지만 왜 신경 써야합니까? 그냥'findAndRemove'를 호출 할 수 없습니까? 더 나아가 자체 제거 기능을 자체 기능으로 분리하십시오. 참고 사항 : 루트를 삭제하라는 메시지가 표시되면 알고리즘이 실패합니다. –