2017-02-11 69 views
0

函數的參數是對遞歸函數中處理變量static的變量的引用嗎?以下是在BST中查找第k個最小根的功能。通過引用循環函數傳遞變量

int findNode(TreeNode* root, int &k) { 
    if(root == NULL) 
     return -1; 
    // We do an inorder traversal here. 
    int k1 = findNode(root->left, k); 
    if(k == 0) return k1; // left subtree has k or more elements. 
    k--; 
    if(k == 0) return root->val; // root is the kth element. 
    return findNode(root->right, k); // answer lies in the right node. 
} 

int kthsmallest(TreeNode* root, int k) { 
    return findNode(root, k); // Call another function to pass k by reference. 
} 

函數kthsmallest返回第k個最小節點的值。

節點定義:

struct TreeNode { 
    int val; 
    TreeNode* left; 
    TreeNode* right; 
} 

我的問題是爲什麼k按引用傳遞。

+2

因爲它在函數中被修改? *在遞歸調用之後使用*。 –

+0

@Someprogrammerdude它沒有被用在調用它的函數中,正如你所看到的。 – Gyanshu

+1

不,但遞歸調用可能會修改它,然後在'findNode'函數中使用它。而'findNode'也可以從其他地方調用?我建議你在調試器中逐步完成代碼,逐步進入遞歸調用,看看真正發生了什麼。 –

回答

2

k的含義與整體算法相關,而不是單獨致電findNode。它就像一個倒數計時器;當k達到0時算法終止。所有的遞歸調用都有助於相同的倒計時。

在調用範圍中傳遞變量的引用可解決與static類似的問題,但它通常被認爲是軟件工程中的一項優秀技術。全局(例如static)限制程序的可伸縮性。

故事的寓意不是使用像k這樣的名字。叫它像remaining_nodes