C++ C++;:二叉树删除根节点
我有一个程序,允许用户在二进制搜索树中添加和删除(除其他外)帐户。我已经测试/调试了这段代码,并找到了导致问题的地方,我只是不太确定如何修复它。我可以很好地添加帐户,并且可以删除除根节点以外的所有节点,而不会出错。以下是我的功能:C++ C++;:二叉树删除根节点,c++,visual-c++,binary-search-tree,C++,Visual C++,Binary Search Tree,我有一个程序,允许用户在二进制搜索树中添加和删除(除其他外)帐户。我已经测试/调试了这段代码,并找到了导致问题的地方,我只是不太确定如何修复它。我可以很好地添加帐户,并且可以删除除根节点以外的所有节点,而不会出错。以下是我的功能: if((current->llink==NULL && current->rlink != NULL) || (current->llink != NULL && current->rlink==NULL
if((current->llink==NULL && current->rlink != NULL) || (current->llink != NULL && current->rlink==NULL)){
if(current->llink==NULL && current->rlink != NULL){
if(trailcurrent->llink==current){
trailcurrent->llink=current->rlink;
delete current;
current=NULL;
cout << "Account #:" << acctNum << " has been removed from the list." << endl;
}
else{
trailcurrent->rlink=current->rlink;
delete current;
current=NULL;
cout << "Account #:" << acctNum << " has been removed from the list." << endl;
}
}
else{
if(trailcurrent->llink==current){
trailcurrent->llink=current->llink;
delete current;
current=NULL;
cout << "Account #:" << acctNum << " has been removed from the list." << endl;
}
else{
trailcurrent->rlink=current->llink;
delete current;
current=NULL;
cout << "Account #:" << acctNum << " has been removed from the list." << endl;
}
}
return;
}
if(current->llink==NULL && current->rlink==NULL){
if(trailcurrent->llink==current) // This 'if' statement crashes the program with a read violation when deleting the root.
trailcurrent->llink=NULL;
else
trailcurrent->rlink=NULL;
delete current;
cout << "Account #:" << acctNum << " has been removed from the list." << endl;
return;
}
if(current->llink != NULL && current->rlink != NULL){
nodeType<accountType>* check=current->rlink;
if((current->llink==NULL)&&(current->rlink==NULL)){
current=check;
delete check;
current->rlink=NULL;
cout << "Account #:" << acctNum << " has been removed from the list." << endl;
}
else{
if((current->rlink)->llink!=NULL){
nodeType<accountType>* leftCurrent;
nodeType<accountType>* leftTrailCurrent;
leftTrailCurrent=current->rlink;
leftCurrent=(current->rlink)->llink;
while(leftCurrent->llink != NULL){
leftTrailCurrent=leftCurrent;
leftCurrent=leftCurrent->llink;
}
current->info=leftCurrent->info;
delete leftCurrent;
leftTrailCurrent->llink=NULL;
cout << "Account #:" << acctNum << " has been removed from the list." << endl;
}
else{
nodeType<accountType>* temp=current->rlink;
current->info=temp->info;
current->rlink=temp->rlink;
delete temp;
cout << "Account #:" << acctNum << " has been removed from the list." << endl;
}
}
return;
}
}
我现在要站出来告诉你(a)我们不知道你的数据类型是什么样的;请记住,我们无法看到您的整个项目,只有您可以,并且(b)我可以向您保证两个链接指针的“大于”比较,如
current->rlink>current->llink
,这不仅可能不是您想要做的,而且除非两个指针在逻辑上来自同一个物理单一分配(包括1-pass-end),这甚至不是标准定义的行为,我完全知道你看不到我的代码,也不知道数据类型。作为比较,我的意思是找到一种方法把它们移到树上。(所以在现实中,它将是链接中节点中的数据)我想不出怎么做。你真的需要知道我的数据类型吗?(难道你不能假设它有一个你选择的变量来解释我需要做什么吗?)当删除根节点时,它会被右或左子树(如果它们存在)替换。查看数据结构文本。
if(current->rlink>current->llink){}