C++ 二叉搜索树删除
删除功能在此BST树中不起作用。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
问题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:当然。我倾向于不经常使用这个结构,在回复中使用它时总是出错(我在自己的代码中使用它的次数很少,只是为了保持一致);)