C++ 删除节点函数不会从二叉搜索树中删除某些节点
这棵树按单词的第一个字母的字母顺序排列。有些词我可以删除,有些词我不能。正如在中一样,我尝试删除它,但什么也没有发生,但它仍然退出deleteWord函数。当我试图删除其中一个单词时,程序什么也不做。它只是给了我一个空白行,我无法输入任何内容;它在某个地方陷入了一个循环,但我不明白为什么。有时,我尝试删除一个单词,而不是将其删除,而是将其替换为另一个节点的数据,我有一个重复的节点。我知道这里有个逻辑错误,但我找不到 “删除”一词的代码为:C++ 删除节点函数不会从二叉搜索树中删除某些节点,c++,pointers,binary-search-tree,C++,Pointers,Binary Search Tree,这棵树按单词的第一个字母的字母顺序排列。有些词我可以删除,有些词我不能。正如在中一样,我尝试删除它,但什么也没有发生,但它仍然退出deleteWord函数。当我试图删除其中一个单词时,程序什么也不做。它只是给了我一个空白行,我无法输入任何内容;它在某个地方陷入了一个循环,但我不明白为什么。有时,我尝试删除一个单词,而不是将其删除,而是将其替换为另一个节点的数据,我有一个重复的节点。我知道这里有个逻辑错误,但我找不到 “删除”一词的代码为: void BinaryTree::deleteWord(
void BinaryTree::deleteWord(string delWord)
{
current = root;
bool found = false;
while(!found)
{
if(current -> data.getWord() == delWord)
{
if(current -> right)
{
if(current -> right -> left)
{
temp = current -> right;
temp -> parent = current;
while(temp -> left)
{
temp -> left -> parent = temp;
temp = temp -> left;
}
if(temp -> right)
{
current -> data = temp -> data;
temp -> data = temp -> right -> data;
temp -> parent -> left = temp -> right;
temp = NULL;
found = true;
}
else
{
current -> data = temp -> data;
temp -> parent -> left = NULL;
temp = NULL;
found = true;
}
}
else if(current -> right -> right)
{
current -> data = current -> right -> data;
current -> right -> right -> parent = current;
current -> right = current -> right -> right;
found = true;
}
else
{
current -> data = current -> right -> data;
current -> right = NULL;
found = true;
}
}
else if(current -> left)
{
if(current -> left -> right)
{
if(current -> left -> right -> left)
{
temp = current -> left -> right;
temp -> parent = current -> left;
while (temp -> left)
{
temp -> left -> parent = temp;
temp = temp -> left;
}
current -> data = temp -> data;
if(temp -> right)
{
temp -> data = temp -> right -> data;
temp -> right = NULL;
found = true;
}
else
{
temp = NULL;
found = true;
}
}
else if(current -> left -> right -> right)
{
temp = current -> left -> right;
current -> data = temp -> data;
current -> left -> right = temp -> right;
temp -> right -> parent = current -> left;
temp = NULL;
found = true;
}
else
{
current -> data = current -> left -> right -> data;
current -> left -> right = NULL;
found = true;
}
}
else if(current -> left -> left)
{
current -> data = current -> left -> data;
current -> left -> left -> parent = current;
current -> left = current -> left -> left;
found = true;
}
else
{
current -> data = current -> left -> data;
current -> left = NULL;
}
}
else
{
current = NULL;
found = true;
}
}
else if(current -> data.getWord() > delWord)
{
if(current -> left)
current = current -> left;
}
else if(current -> data.getWord() < delWord)
{
if(current -> right)
current = current -> right;
}
else
{
cout << "word somehow not found, check code.";
found = true;
}
}
}
以及在树上添加单词
void BinaryTree::addWord(string newWord, string newMeaning)
{
WordNode* temp = new WordNode;
if(empty())
{
temp -> data = Word(newWord, newMeaning);
temp -> left = NULL;
temp -> right = NULL;
temp -> parent = NULL;
root = temp;
}//end if
else
{
current = root;
while(current)
{
if(newWord > current -> data.getWord())
{
if(current -> right == NULL)
{
temp -> data = Word(newWord, newMeaning);
temp -> right = NULL;
temp -> left = NULL;
temp -> parent = current;
current -> right = temp;
current = NULL;
}
else
current = current -> right;
}//if
else if(newWord < current -> data.getWord())
{
if(current -> left == NULL)
{
temp -> data = Word(newWord, newMeaning);
temp -> right = NULL;
temp -> left = NULL;
temp -> parent = current;
current -> left = temp;
current = NULL;
}
else
current = current -> left;
}//elseif
}//while
}//else
}//funct
void BinaryTree::addWord(字符串newWord,字符串newmeans)
{
WordNode*temp=新的WordNode;
if(空())
{
临时->数据=单词(新词,新意);
temp->left=NULL;
temp->right=NULL;
temp->parent=NULL;
根=温度;
}//如果结束
其他的
{
电流=根;
while(当前)
{
if(newWord>current->data.getWord())
{
如果(当前->右==NULL)
{
临时->数据=单词(新词,新意);
temp->right=NULL;
temp->left=NULL;
临时->父级=当前;
当前->右侧=温度;
电流=零;
}
其他的
当前=当前->右侧;
}//如果
else if(newWorddata.getWord())
{
如果(当前->左==NULL)
{
临时->数据=单词(新词,新意);
temp->right=NULL;
temp->left=NULL;
临时->父级=当前;
当前->左=温度;
电流=零;
}
其他的
当前=当前->左侧;
}//埃尔塞夫
}//当
}//否则
}//函数
将最终else语句编辑为:
else
{
cout << "else entered.\n";
if(current -> data.getWord() < current -> parent -> data.getWord())
{
current -> parent -> left = NULL;
current = NULL;
found = true;
}
else if(current -> data.getWord() > current -> parent -> data.getWord())
{
current -> parent -> right = NULL;
current = NULL;
found = true;
}
else
{
current = NULL;
found = true;
}
}
else
{
cout data.getWord()parent->data.getWord())
{
当前->父->左=空;
电流=零;
发现=真;
}
else if(当前->数据.getWord()>当前->父级->数据.getWord())
{
当前->父->右=NULL;
电流=零;
发现=真;
}
其他的
{
电流=零;
发现=真;
}
}
temp是addWord
中的局部变量,但在deleteWord
中我找不到它;我可以假设它是BinaryTree的成员吗?欢迎回来。如果您给我们一个答案,这个问题将更容易回答,并且您遇到的错误的更完整描述(“它卡住了”不清楚)。它是BinaryTree
的成员。我没有在deleteWord函数中声明它,因为我没有将它指向新节点,而是将它用作现有节点的指针。编辑说明。另外,我不知道什么是最小的例子,因为每当我包括我认为是最小的,我要求其他功能。你没有按照链接。最小完整示例是一个完整的示例(即,我们可以复制代码、编译、运行并查看错误)和最小的示例(即,如果您以任何方式使其更简单,则不会出现错误)。这需要大量代码才能运行它。(3个头文件和2个cpp文件)但我修复了它。问题存在于最终else中,即不删除子节点的父链接器。
else
{
cout << "else entered.\n";
if(current -> data.getWord() < current -> parent -> data.getWord())
{
current -> parent -> left = NULL;
current = NULL;
found = true;
}
else if(current -> data.getWord() > current -> parent -> data.getWord())
{
current -> parent -> right = NULL;
current = NULL;
found = true;
}
else
{
current = NULL;
found = true;
}
}