2013-08-27 6 views
-3

삭제 기능이 BST 트리에서 작동하지 않습니다 삭제합니다. 난 코드에 주어진대로
1 문제는 삭제 된 노드 널하지 않으며 둘째는 다른 조건에서 무한 간다.이진 검색 트리

#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

_not의 working_은 계속 훨씬 없습니다. 무슨 일이 일어나고 있는지, 그리고 무엇을 시도했는지 설명해 주시겠습니까? –

답변

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'를 사용하지 마십시오. NULL 포인터 값이 아닌 NUL 문자이기 때문에 컴파일러가 양자를 모두 같게 받아 들일 수 있지만 독자에게는 큰 차이가 있습니다.

+0

@JerryCoffin : 물론. 나는이 구조체를 많이 사용하지 않는 경향이 있으며 응답에서 사용할 때 잘못 이해하고 있습니다 (그리고 몇 번만 일관성있게하기 위해 내 자신의 코드에서 사용합니다 ...).) –

0

당신은 T을 수정할 수 있지만 T는 지역 변수입니다. 호출자가 전달한 변수를 변경하려면 T을 참조로 전달해야합니다. createbst에서와 같이합니다.

그리고 그런데

, 당신은 메모리가 누수된다.