我正在寫一個C++分配的代碼,它是一個使用二叉搜索樹的字典實現。我的代碼編譯,但是當我嘗試「刪除」我得到一個seg故障。任何想法爲什麼會發生。由於在我的刪除操作在C + +中的Seg錯誤
這裏是我的代碼
// this function calls the deleteNode function where the deletion is done
void BST::deleteContent(string *word)
{
deleteNode(word, root);
}
// a helper fuuntion for the deletecontent function
//uses recursion to find the node to be deleted
void BST::deleteNode(const string *word, Node *&nodePtr)
{
if(word < nodePtr->word)
deleteNode(word, nodePtr->left);
else if(word > nodePtr->word)
deleteNode(word, nodePtr->right);
else
makeDeletion(nodePtr);
}
// a helper function for the deleteNode function
void BST::makeDeletion(Node *&nodePtr)
{
Node *tempNodePtr;
if(nodePtr == NULL)
cout<< "cannot delete empty node. \n";
// if node has no right child
else if (nodePtr->right == NULL)
{
tempNodePtr = nodePtr;
nodePtr = nodePtr->left; // reattach child
delete tempNodePtr;
}
else if(nodePtr-> left == NULL)
{
tempNodePtr = nodePtr;
nodePtr = nodePtr->right; // reattach child
delete tempNodePtr;
}
// if node has 2 children
else
{
tempNodePtr = nodePtr->right;
while (tempNodePtr->left)
tempNodePtr = tempNodePtr->left;
tempNodePtr->left = nodePtr->left;
tempNodePtr = nodePtr;
nodePtr = nodePtr->right;
delete tempNodePtr;
}
}
編輯:
謝謝大家!從你的帖子我意識到這是一個好主意,檢查節點是否是最後一個,沒有孩子。我加入這個檢查在deleteNode
if((nodePtr->left) && word < nodePtr->word)
{
do something
}
我做了正確的 它的工作,並沒有拋出任何錯誤或故障賽格相同。非常感謝!!!!
如果被刪除的單詞不在樹中,則會遞歸到一個空節點中。當你嘗試做'nodePtr-> word'時,你將會解引用一個空指針。 – Barmar 2014-09-12 21:43:14
啓用coredump並查看回溯。在刪除檢查null和打印輸出之前 – resultsway 2014-09-12 21:43:18
在'makeDeletion'中,您不處理左側和右側子項都爲空的情況。 – Barmar 2014-09-12 21:45:07