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){}