我正在尝试创建一个从二叉搜索树中删除节点的函数。我得到了第三个案例,节点有2个孩子在工作,但我的代码不起作用,节点有1个孩子或没有孩子。
这是我直接从书中复制的代码。我从这本书中获得的代码是错误的吗?
template <class elemType>
void bSearchTreeType<elemType>::deleteFromTree
(nodeType<elemType>* &p)
{
nodeType<elemType> *current; //pointer to traverse the tree
nodeType<elemType> *trailCurrent; //pointer behind current
nodeType<elemType> *temp; //pointer to delete the node
if (p == NULL)
cout << "Error: The node to be deleted is NULL."
<< endl;
else if (p->lLink == NULL && p->rLink == NULL)
{
temp = p;
p = NULL;
delete temp;
}
else if (p->lLink == NULL)
{
temp = p;
p = temp->rLink;
delete temp;
}
else if (p->rLink == NULL)
{
temp = p;
p = temp->lLink;
delete temp;
}
答案 0 :(得分:0)
您确定您的代码与2个孩子完美配合吗?因为你提供的上述片段只处理了3个案例:(1)没有孩子,(2)1个孩子指向左ptr,(3)1个孩子指向右ptr ...最后一个案例,其中有2个孩子,根本就没有......
所以回答你的问题:是的,你提供的上述代码似乎是错误的(a.k.a.不完整)。
我设法找到你正在使用的来源。在上面显示的函数中是否包含以下代码(在else if
流后添加),或者它是否缺席?
else
{
current = p->llink;
trailCurrent = NULL;
while(current->rlink != NULL)
{
trailCurrent = current;
current = current->rlink;
} //end while
p->info = current->info;
if(trailCurrent == NULL) //current did not move;
//current == p->llink; adjust p
p->llink = current->llink;
else
trailCurrent->rlink = current->llink;
delete current;
}//end else