二进制搜索树删除

时间:2013-08-27 15:02:18

标签: c++ binary-search-tree

删除功能在此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*/

2 个答案:

答案 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中一样。

顺便说一下,你正在泄露记忆。