2016-07-14 5 views
0

그래서 난이 구조체에 보이는 C에서 이진 검색 트리를 코딩 :이진 검색 트리

struct tnode 
{ 
int content; 
struct tnode *left; /* left tree part */ 
struct tnode *right; /* right tree part */ 
}; 

내 주요 방법 :

int main() 

struct tnode *Baum = NULL; 
struct tnode *tmpPos = NULL; 
Baum = addelement (Baum, 32); 
Baum = addelement(Baum, 50); 
Baum = addelement(Baum, 60); 
tmpPos = searchnode(Baum,50); 

그래서 basicly이 나에게 3와 이진 검색 트리를 생성 (32, 50, 60)를 포함한다. 내 searchnode 메서드는 포인터를 "50"으로 이동시켜 나중에 삭제할 수 있습니다. 그러나 내 searchnode 메서드는 검색하는 요소가 내 이진 검색 트리의 루트 인 경우에만 포인터를 반환합니다.

는 searchnode :

struct tnode *searchnode(struct tnode *p, int nodtodelete) 
{ 
if (p == NULL) 
{ 
    printf("Baum ist leer oder Element nicht vorhanden \n"); 
} 
if (p -> content == nodtodelete) 
{ 
    return p; 
} 
if (p->content > nodtodelete) 
{ 
    searchnode (p->right, p->content); 
} 
if (p->content < nodtodelete) 
{ 
    searchnode(p->left, p->content); 
} 
} 

아마 너희들은 나에게 도움이 될 수 있습니다.

searchnode (p->right, nodtodelete); 
        ^

다른 재귀 호출에 같은 변화를 확인 :

+2

왼쪽/오른쪽 하위 트리 결정을 취소하지 않았습니까? 'if (p-> content> nodtodelete)'라면 왼쪽 경로를 택해야합니다. –

+0

사이트에 오신 것을 환영합니다! 품질 좋은 답변을 얻을 수있는 질문에 대한 자세한 내용은 [둘러보기] (https://stackoverflow.com/tour)를 확인하십시오. 'addelement()'가 올바르게 작동한다는 것을 이미 확인 했습니까? – cxw

+0

'searchnode'는 4 개의'if' 중 3 번째에 아무것도 반환하지 않습니다. – halex

답변

2

함수 정의되지 않은 동작을 일으 킵니다.

또한 올바른 입력을 사용하려면 재귀 호출을 수정해야합니다.

struct tnode *searchnode(struct tnode *p, int nodtodelete) 
{ 
    if (p == NULL) 
    { 
     printf("Baum ist leer oder Element nicht vorhanden \n"); 
     return NULL; 
    } 

    if (p -> content == nodtodelete) 
    { 
     return p; 
    } 

    // This is copied from OP's question but it seems suspect. 
    // It should probably be: 
    // if (p->content < nodtodelete) 
    if (p->content > nodtodelete) 
    { 
     return searchnode (p->right, nodtodelete); 
    } 

    return searchnode(p->left, nodtodelete); 
} 
+0

고마워요. 나는 귀환 키워드를 잊어 버린 것에 대해 너무 바보입니다 ... –

+0

이제는 잘 작동합니다. –

+0

바이너리 검색 트리와 관련된 또 다른 질문으로 aswer를 게시했습니다. 아마도 여기 실수를 발견 할 수도 있습니다. –

2

당신은 당신이 노드의 값이 아닌 검색하는 값을 전달해야한다. 는 재귀 호출의 모든 return 문이 없기 때문에

searchnode(p->left, nodtodelete); 
+0

둘 다 편집했는데, 여전히 작동하지 않지만 한 점 확실합니다 –