我正在解决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!
};
作为一名学生,这是我第一次遇到与指针和引用相关的案例。对于这种差异的任何解释,我将不胜感激。
最佳答案
如果你这样做
void foo(int * inner_ptr) {
ptr++;
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int outer_ptr = &arr[1];
foo(outer_ptr);
}
outer_ptr
仍等于 &arr[1]
。
您仅更改了 inner_ptr
,即 outer_ptr
的拷贝。
您可以更改它指向的内容。
void foo(int * inner_ptr) {
(*ptr) = 42;
}
但不是 outer_ptr
本身
因此您需要此签名:(带引用)
void foo(int * & inner_ptr);
或者这个签名:(指向指针的指针)(在这种情况下,您将在函数体中以不同的方式使用它)
void foo(int * * inner_ptr);
关于C++ 引用 - SomeType* &val 与 SomeType* val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70115227/