2012-05-15 9 views
1


재귀 함수를 사용하여 이진 트리 (아니요, 이진 검색 트리가 아니라 이진 트리가 아닙니다)를 사용하여 검색 방법을 만들려고합니다. 데이터가 이진 트리에 있다면 노드를 반환하고 싶지 않은 경우 NULL 값을 반환합니다. 나는 검색 기능을 만들었고 완벽하게 그 일을하고있다. 하지만 문제는 함수가 노드를 반환하지 않는 것 같습니다. 여기 C : 이진 트리 검색 방법

는 이진 트리에 대한 struct의 :

struct data 
{ 
    int number; 
    struct data *left, *right; 
}*root = NULL; 

이 내가 이야기하고있는 검색 기능입니다 :

data* search(struct data *node, int key) 
{ 
    if(node == NULL) 
     return NULL; 
    else 
    { 
     printf("\n%d %d -", node->number, key); 

     if(node->number== key) 
      return node; 

     search(node->left, key); 
     search(node->right, key); 
    } 
} 

이 같은 검색 기능을 호출 해요 : search(root, 6); , 그것은 6 숫자를 이진 트리에 밀어 넣었지만 (검색 함수는 return node; 라인에서 너무 멈 춥니 다.) 그 값을 가정 할 때 NULL 값을 반환합니다. 함수는 NULL을 반환합니다.

here의 이진 트리에 대한 튜토리얼을 보았습니다. 일부 코드를 사용하고 변경했지만 여전히 동일합니다. 나는 필사적으로 바로 여기에 도움을 찾고 있어요 :(

+2

C 또는 C++? 근본적으로 다른 짐승. –

+0

일부 호출이 null이 아닌 포인터를 반환하면 그 값은 어떻게됩니까? –

+0

@ KonradRudolph : 실제로 C이지만 C++ 컴파일러를 사용하고 있으므로 문제가되지 않습니다. . – aquatorrent

답변

4

함수는 항상 최상위 노드는 키가 포함 된 경우를 제외하고, NULL를 반환합니다 당신의 함수는 재귀 호출의 결과로 아무것도하지 않습니다. 사실, . 제어 흐름은

당신은 재귀 호출에서 반환 값을 확인해야 return 문을 타격하지 않고 그것의 "결국 떨어지지"때 적절한 사람을 전달할 수 있습니다은 "삼항 연산자

if (node == NULL) 
    return NULL; 
else if (node->number == key) 
    return node; 
else { 
    data *left = search(node->left, key); 
    return left? left: search(node->right, key); 
} 

주 "(if-then-else expre 시온) ?:. 이 같은 당신 search

변화 그것의 반환 값을 사용하지 않는

+1

죄송합니다. -1. 재귀 호출 후에 함수의 끝에서 제어가 흐를 때 NULL을 반환하는 함수에 의존 할 수 없습니다. –

+0

@JerryCoffin : 그렇지 않습니다. 재귀 호출의 반환 값은'return' 문에서 사용됩니다. –

+1

끝에서 실행되지 않습니다. 항상 3 가지 경우 중 하나를 반환합니다. 세 번째 경우에는 node == NULL 인 경우 NULL, node-> number == 키인 경우 노드 및 (data * || 데이터 *)입니다. 첫 번째 검색에서 NULL이 아닌 값이 반환되면 해당 값이 사용됩니다. 두 번째 검색이 NULL이 아닌 값을 반환하면 값이 사용됩니다. 그렇지 않으면, (data *) (0 || 0)을 리턴하며, 이는 NULL이됩니다. –

1

IT는 검색 노드를 반환하지 않습니다.

data* search(struct data *node, int key) 
{ 
    if(node == NULL) 
    return NULL; 
    else 
    { 
    printf("\n%d %d -", node->number, key); 

    if(node->number== key) 
     return node; 
    struct data *tmp; 
    tmp = search(node->left, key); 
    /* node found ? */ 
    if (tmp) 
     return tmp; 
    tmp = search(node->right, key); 
    /* node found ? */ 
    if (tmp) 
     return tmp; 
    } 
    /* search didn't find anything */ 
    return NULL; 
} 
1

실제로 재귀 호출에서 검색 결과를 반환하지 않습니다.

당신은 이러한 호출에서 반환 값을 확인해야하고, 그들이 노드를 발견하는 경우, 이진 트리를 만들 수있는 훨씬 더 쉽고 효율적인 방법이

data* search(struct data *node, int key) 
{ 
    data* found = NULL; 

    if(node == NULL) 
     return NULL; 

    printf("\n%d %d -", node->number, key); 

    if(node->number== key) 
     return node; 

    found = search(node->left, key); 
    if (found) 
     return found; 

    found = search(node->right, key); 
    if (found) 
     return found; 

    return NULL; 
} 
0

을 반환하고 그와 함께 단순히이다 벡터/배열.

i는 벡터에 액세스하는 int입니다. 오른쪽으로 가려면, i = i * 2. 왼쪽으로 가려면, i = i * 2 + 1. 그들은 같은 자리를 공유하지 않을 것이고 각 자리가 균등하게 배정된다고 가정합니다.