C++ 二叉搜索树删除

C++ 二叉搜索树删除,c++,binary-search-tree,C++,Binary Search Tree,删除功能在此BST树中不起作用。 问题1:它不会像我在代码中给出的那样使删除的节点为空,其次,它在else条件下变为无穷大 #include<iostream> using namespace std; struct bstnode{ bstnode *lchild; int data; bstnode *rchild; }; void creatbst(bstnode *&T,int k){ if(T=='\0'){ T=new(bstn

删除功能在此BST树中不起作用。
问题1:它不会像我在代码中给出的那样使删除的节点为空,其次,它在else条件下变为无穷大

#include<iostream>
using namespace std;

struct bstnode{
bstnode *lchild;
int data;
bstnode *rchild;    
};

void creatbst(bstnode *&T,int k){
    if(T=='\0'){
        T=new(bstnode);
        T->data=k;
        T->lchild='\0';
        T->rchild='\0';
    }
    else if(k<T->data){
        creatbst(T->lchild,k);
    }
    else if(k>T->data){
        creatbst(T->rchild,k);
    }
}

bstnode *searchbst(bstnode *T,int k){
    if(T=='\0')
    return ('\0');
    else{

     if(k<T->data)
return searchbst(T->lchild,k);  

    else if(k>T->data)
    return searchbst(T->rchild,k);  

    else
        return T;
    }
}

int nmax(bstnode *T){
    while(T->rchild!='\0'){
        T=T->rchild;
    }
    return (T->data);
}
int nmin(bstnode *T){
    while(T->lchild !='\0'){
        T=T->lchild;
    }
    return (T->data);
}
void printleaf(bstnode *T){
    if(T=='\0'){
    return; 
    }
    else if((T->rchild=='\0')&&(T->lchild=='\0'))
    cout<<T->data<<endl;
    else{
        printleaf(T->lchild);
        printleaf(T->rchild);
    }
}
void printnleaf(bstnode *T){
    if(T=='\0'){
        return;
    }
    else if(T->rchild!='\0' || T->lchild!='\0')
    {cout<<T->data<<endl;;
    printnleaf(T->lchild);
    printnleaf(T->rchild);}
    else{
    return;
    }
}

void ldelete(bstnode *T,int x){
    int y;
    T=searchbst(T,x);

    if((T->lchild=='\0')&&(T->rchild=='\0'))
    T='\0';
    else{
        y=nmax(T->lchild);
        T->data=y;
        ldelete(T,y);
    }
}



int main(){
    bstnode *T;
    bstnode *D;
    T='\0';
    creatbst(T,36);
    creatbst(T,20);
    creatbst(T,75);
    creatbst(T,42);
    creatbst(T,8);
    creatbst(T,31);
    creatbst(T,25);
    creatbst(T,3);
    creatbst(T,80);

    ldelete(T,20);
    printleaf(T);
    printnleaf(T);
    return 0;

}
/*delete function is not working*/
#包括
使用名称空间std;
结构节点{
bstnode*lchild;
int数据;
bstnode*rchild;
};
void creatorbst(bstnode*&T,int k){
如果(T=='\0'){
T=新的(节点);
T->data=k;
T->lchild='\0';
T->rchild='\0';
}
else if(kdata){
创建BST(T->lchild,k);
}
else if(k>T->data){
createbst(T->rchild,k);
}
}
bstnode*searchbst(bstnode*T,int k){
如果(T=='\0')
返回('\0');
否则{
if(kdata)
返回searchbst(T->lchild,k);
else if(k>T->data)
返回searchbst(T->rchild,k);
其他的
返回T;
}
}
int nmax(bstnode*T){
而(T->rchild!='\0'){
T=T->rchild;
}
返回(T->数据);
}
int nmin(bstnode*T){
而(T->lchild!='\0'){
T=T->lchild;
}
返回(T->数据);
}
无效打印页(bstnode*T){
如果(T=='\0'){
回来
}
如果((T->rchild='\0')&&(T->lchild=='\0'))
coutrchild!='\0'| | T->lchild!='\0')
{coutlchild='\0')&&(T->rchild=='\0'))
T='\0';
否则{
y=nmax(T->lchild);
T->data=y;
l删除(T,y);
}
}
int main(){
bstnode*T;
b节点*D;
T='\0';
bST(T,36);
bST(T,20);
bST(T,75);
b(T,42);
bST(T,8);
bST(T,31);
b(T,25);
bST(T,3);
bST(T,80);
ldelete(T,20);
打印叶(T);
printnleaf(T);
返回0;
}
/*删除功能不工作*/

您需要传递对节点T的引用:

void ldelete(bstnode*&T,int x){
    int y;
    T=searchbst(T,x);

    if((T->lchild=='\0')&&(T->rchild=='\0'))
    T='\0';
    else{
        y=nmax(T->lchild);
        T->data=y;
        ldelete(T,y);
    }
}
否则,
T
节点仅在函数中本地更新。 [我不认为这足以完全修复您的代码,但它应该可以解决眼前的问题]


在其他注释中:不要使用
'\0'
来表示空指针值。这是一个NUL字符,而不是空指针值,它们是完全不同的-编译器可能会将两者视为相同,但对读者来说,这会产生很大的差异。

您修改了
t
,但
t
是一个局部变量。您必须传递
 如果要更改调用方传递的变量,请将T
作为引用。就像在
createbst
中所做的那样


顺便说一句,你正在泄漏内存。

不工作不是很好。你能解释一下发生了什么事以及你做了什么吗?@JerryCoffin:当然。我倾向于不经常使用这个结构,在回复中使用它时总是出错(我在自己的代码中使用它的次数很少,只是为了保持一致);)