2017-12-08 10 views
0

이진 탐색 트리에서 최소값을 반환하는 재귀 함수를 작성하려고합니다.BST에서 최소값을 반환하는 재귀 함수를 작성하는 방법은 무엇입니까?

int RecursiveFindMin(Tree t) { 
    if (t==NULL) 
    return -1; 
    else { 
    if (t!=NULL) 
     RecursiveFindMin(t->left); 
    } 

    return t->val; 
} 

나는

대신 BST에 최소 값을 얻을 것으로 예상, 나는 두 번째 작은 결과를 얻고, 대부분의 시간! 재귀 함수가 좋지 않아 도움을 주시면 감사하겠습니다.

+1

최소값이 가장 왼쪽의 잎에 위치하고 간단한 반복으로 찾을 수 있으므로 여기에서 재귀 할 필요가 없습니다. 함수에서 재귀 호출의 반환 값을 삭제합니다. –

+0

@EugeneSh. 나는 할당이 그들에게 재귀를 사용하도록 요청했다고 생각한다. –

+0

@HunterMcMillen 맞아! –

답변

0

함수에 대한 재귀 호출을 수행하면 반환 값을 무시합니다. 그래서 재귀는 효과적으로 아무것도하지 않습니다. 전달중인 첫 번째 노드의 값이 반환됩니다.

올바른 종료 조건도 사용하고 있지 않습니다. 현재 노드가 NULL 일 때 멈추고 싶지는 않습니다. 왜냐하면 이 왼쪽 일 경우 노드가 NULL 일 때입니다. 그러면 원하는 값이 해당 노드에 있습니다.

그래서 왼쪽 노드를 확인하기 위해 조건을 변경하고, 재귀 호출의 값을 반환 :

int RecursiveFindMin(Tree t) { 
    if (t->left==NULL) 
    return t->val; 
    else { 
    return RecursiveFindMin(t->left); 
    } 
} 
+0

3 자 연산을 사용하여 좋은 oneliner가 될 수 있습니다 .. –

+0

'RecursiveFindMin (NULL)'은 오류를 생성합니다. –

+0

@ M.Hamra 기꺼이 도와 드릴 수 있습니다. 유용하다고 생각되면 [이 대답 수락] (https://stackoverflow.com/help/accepted-answer)을 자유롭게 할 수 있습니다. – dbush

0

당신은 모든 왼쪽 노드 값을 반환됩니다. 그래서 마침내 루트 값을 반환합니다. 가장 왼쪽의 노드를 찾아서 그 값을 최소값으로 고정해야합니다.

const int kInf = 100000000; 
int RecursiveFindMin(Tree t) { 
    if (t == NULL) return kInf; 
    int v = RecursiveFindMin(t->left); 
    return v == kInf? t->val : v; 
} 

kInf을 트리에없는 값으로 사용했습니다.

+0

const int kInf = 100000000; -이 상수는 어떻게 선택 했습니까? 0x7fffffff (int의 경우 4 바이트를 고려)가 더 의미가있을 수 있습니까? – Sudhee

+0

이것은 단지 자리 표시 자 값입니다. 값은 트리가 아닌 값이어야합니다. – abdullah