删除功能在此BST树中不起作用 问题1它没有使删除的节点为null,就像我在代码中给出的那样,其次是在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*/
答案 0 :(得分:1)
您需要传递对节点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 charactger,而不是一个NULL指针值,它们是完全不同的 - 编译器可能会同时接受它们,但对于读者来说它会产生很大的不同。
答案 1 :(得分:0)
您修改T
,但T
是一个局部变量。如果要更改调用者传递的可变量,则必须将T
作为参考传递。就像在createbst
中一样。
顺便说一下,你正在泄露记忆。