2015-01-16 5 views
1

BST에서 가장 큰 값인 n을 인쇄하려고합니다. 포인터에 문제가 있습니다. 코드의 일부입니다.BST에서 n 개의 값을 인쇄하십시오.

void bt_printN(node *leaf,int *n) 
{ 
    if((leaf != NULL) && *n > 0) 
    { 
     bt_printN(leaf->right,n); 
     printf("%s %d\n",leaf->word, leaf->i); 
     *n--; 
     bt_printN(leaf->left,n); 
    } 
} 

그리고이 작동하지 않습니다, 같은 재귀 함수에 n 값을 전달하는 적절한 방법은 무엇입니까?

+4

전달하는 것이 좋습니다. 그것은 감소하지 않습니다. '* n -'는 포인터가 값을 가리키는 것이 아니라 포인터를 감소시킨다; 값을 감소 시키려면'(* n) -'이 필요합니다. 다른 모든 것이 OK인지 여부는 별도의 토론입니다. 그것은 N 가장 작은 값을 인쇄 할 가능성이 더 커 보인다 - 지적 된 것처럼 RHS를 먼저하고 있으므로 ... 결국 괜찮을 수도 있습니다. –

+0

Coudl 답변으로 게시하므로 받아 들일 것입니다 – whd

+2

@WhozCraig : 예, 가장 큰 값으로 먼저 작동합니다. 'n '값이 호출을 통해 줄어들었기 때문에 코드가 현재 노드를 출력하기 전에'leaf-> right'에서 재귀 호출 후에'* n> 0'을 검사해야한다고 생각합니다. –

답변

1

기본 문제는 전달하는 방식이 아닙니다. n; 가장 큰 문제점은 *n--이 값이 지적되지 않은 포인터를 감소시키는 것입니다. 가리키는 값을 줄이려면 (*n)--이 필요합니다.

고정되어 있으면 코드가 가장 작습니다. '가장 작은 것'에 대한 내 청어의 의견에도 불구하고. 그러나 재귀 호출 bt_printN(leaf->right, n); 호출 후 해당 함수가 자체 노드를 인쇄하기 전에 n을 확인해야한다고 생각합니다. 두 번째 재귀 호출 전에 검사 할 필요는 없지만 그렇게하려면 사소한 (최소) 최적화 일 수 있습니다. 쓰여진 것처럼, 입력시 *n == 1이라면 오른쪽으로 되풀이되지만 그 다음에는 각 노드가 RHS를 따라 내려 가면서 하나씩 만 필요합니다.

관련 문제