我正在解決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!
};
作為一名學生,這是我第一次遇到這種與指標和參考相關的案例。對于這種差異的任何解釋,我將不勝感激。
uj5u.com熱心網友回復:
如果你這樣做
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);
uj5u.com熱心網友回復:
答案是沒有參考 ( void traverse(TreeNode* root, TreeNode* curr, int &sol){...})curr值將不會為函式的未來呼叫更新(將從呼叫堆疊中執行)。
但是當有參考時 ( void traverse(TreeNode* root, TreeNode* &curr, int &sol){...})curr值將被更新并用于下一次呼叫,直到程式終止。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/366062.html
上一篇:允許用戶更改陣列函式中“5”的值
