그래서 내 질문은 왜 이것이 작동하지 않는지 이해할 수 없습니다. 나는 분명히 부모가 결코 초기화되지 않는다고 말하는 곳 아래에 주석을 달았다. 나는 포인터를 잘못하고있는 것입니까, 나는 논리를 거꾸로 갖게 되었습니까? 나는 지금까지 그것을 처음부터 시작하는 것이 더 낫겠습니까? 이것은 내가 직면 한 가장 어려운 임무이므로 어떤 도움이라도 매우 유용 할 것입니다.C++ 이진 검색 트리 삭제
void Dictionary::remove(string word)
{
if(root == NULL)
{
cout << "list is empty\n";
return;
}
DictionaryNode *curr = root;
DictionaryNode *parent = NULL;`
while(curr != NULL)
{
if(curr->word == word)
break;
else
{
parent = curr;
if(word > curr->word)
curr = curr->right;
else
curr = curr->left;
}
}
//LEAF node.
if(curr->left == NULL && curr->right == NULL)
{
if(parent->left == curr) // Right here is an access violation. Which doesn't //make sense.
{
parent->left = NULL;
}
else
{
parent->right = NULL;
}
delete curr;
}
/*
* Node has a single child LEFT or RIGHT
*/
if((curr->left == NULL && curr->right != NULL) || (curr->left != NULL && curr->right == NULL))
{
if(curr->left == NULL && curr->right != NULL)
{
if(parent->left == curr) //if(parent->left == curr) //says parent is //not intialized
{
parent->left = curr->right;
delete curr;
}
else
{
parent->right = curr->right;
delete curr;
}
}
else
{
if(parent->left == curr)
{
parent->left = curr->left;
delete curr;
}
else
{
parent->right = curr->left;
delete curr;
}
}
}
if (curr->left != NULL && curr->right != NULL)
{
DictionaryNode* temp;
if(parent == NULL || parent->left==curr)
{
temp = curr->right;
while(temp->left!=NULL)
temp = temp->left;
if(parent!=NULL)
parent->left = curr->right;
else
root = curr->right;
temp->left = curr->left;
curr->left = curr->right=NULL;
delete curr;
}
else if(parent->right==curr)
{
temp = curr->left;
while(temp->right!=NULL)
temp = temp->right;
parent->right=curr->left;
temp->right = curr->right;
curr->left = curr->right=NULL;
delete curr;
}
}
}
사전에 정확히 1 개의 요소가 포함되면 어떻게됩니까? 'curr == root','parent == NULL','parent-> left'는 액세스 위반입니다. – timrau
또한,'delete curr;'다음에'curr-> left'에 접근하려고했습니다. 이것은 분명히 해제 된 메모리 읽기입니다. – timrau
우선, 편집 해 주셔서 감사합니다. 저의 인생을 생각할 수 없었습니다. 하나의 요소가 있다면 작동합니다. 내 질문에 좀 더 구체적이어야 했어. 그것은 내 얼굴에 오류를 던지기 시작하는 무언가를 삭제하려고 할 때입니다. – varrick