2017-02-11 44 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