所以,我的問題是我不明白爲什麼這不起作用。我在下面評論了它在說什麼,當它明確時父從未被初始化。我在做指針錯誤嗎?我是否已經將邏輯向後推進,我現在離開了,從頭開始更好?這是我遇到的最困難的任務,所以任何幫助都是非常有益的。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