【发布时间】:2022-01-03 23:21:06
【问题描述】:
我正在解决 LeetCode 783. BST 节点之间的最小距离,我注意到正确解决方案和错误解决方案之间的区别是我的函数调用中的参考 (&) ,如下:
正确的解决方案:
class Solution {
public:
void traverse(TreeNode* root, TreeNode* &curr, int &sol){
if (root == nullptr) return;
traverse(root->left, curr, sol);
if(curr) sol = min(sol, abs(root->val - curr->val));
curr = root;
traverse(root->right, curr, sol);
}
int minDiffInBST(TreeNode* root) {
int sol = INT_MAX;
TreeNode* curr = nullptr;
traverse(root, curr, sol);
return sol;
}
};
不正确的解决方案:
class Solution {
public:
void traverse(TreeNode* root, TreeNode* curr, int &sol){
//Exactly the same as above!
};
作为一名学生,这是我第一次遇到这种与指针和引用有关的案例。对于这种差异的任何解释,我将不胜感激。
【问题讨论】:
-
这不是极端情况。分配给函数的非引用参数在该函数之外没有任何影响。指针没有什么特别之处。
-
不要与指针混淆。将其视为与
int sol和int& sol之间的相同区别 -
当您使用“正确”解决方案调用
s.traverse(r, c, sol)时,它将对变量c进行操作,而不是对其副本进行操作。因此,当函数返回时,c将包含traverse存储在此变量中的最后一个值(如果有)。 -
在一种情况下,您传递的是
TreeNode的地址。在另一个中,您传递对一个对象的引用,该对象的值是TreeNode的地址。 -
区别与
int和int&之间的区别完全一样。
标签: c++ pointers pass-by-reference