2015-01-16 82 views
1

最大的價值我想打印從BST n最大的價值,我有一定的問題的指針,這裏是我的代碼的一部分。打印n的BST

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) - '來減少值。一切是否正常都是一個單獨的討論;它看起來更有可能打印出N個最小值 - 除非如前所述,你首先要做RHS,所以......你可能確實沒問題。 –

+0

Coudl你張貼的答案,所以我會接受它 – whd

+2

@WhozCraig:是的,我看到它會與最大值工作第一。我懷疑在打印出當前節點之前,在''leaf-> right'遞歸之後,代碼應該檢查'* n> 0',因爲'n'的值可能通過調用縮小。 –

回答

1

的主要問題是不是你傳遞n的方式;主要問題是*n--遞減指針,而不是指向值。您需要(*n)--來減少指向的值。

隨着那固定的,你的代碼是大多數的方式出現 - 儘管我對「從小到大」紅鯡魚意見。但是,我認爲您需要在遞歸調用bt_printN(leaf->right, n);之後並在函數打印自己的節點之前檢查n。您不必在第二次遞歸調用之前進行檢查,但它可能是次要(最小)優化。正如所寫的,如果輸入*n == 1,它會向右遞歸,但隨後RHS中每個節點都將打印其值,即使只需要一個節點。