【问题标题】:Why is my node set as a nullptr after I have set it = new Node?为什么我的节点设置为 nullptr 在我设置它 = 新节点之后?
【发布时间】:2020-10-17 15:18:03
【问题描述】:

我已将节点指针初始化为 nullptr,并将其作为引用传递给辅助函数。在辅助函数内部,我将之前为 nullptr 的指针设置为等于 new Pointer。但是,函数结束后,又被设置为nullptr。

void helper(vector<int>& nums, int start, int end, TreeNode* root){
    if(start >= end) return;
    root = new TreeNode;
    int median = (start + end) / 2;
    root -> val = nums[median];
    helper(nums, start, median - 1, root -> left);
    helper(nums, median + 1, end, root -> right);
}

TreeNode* sortedArrayToBST(vector<int>& nums) {
    TreeNode* root = nullptr;
    helper(nums, 0, nums.size() - 1, root);
    return root;
}

【问题讨论】:

  • root = new TreeNode; 对这个函数的调用者没有任何意义。指针只是一个标量(尽管在使用上很特殊)。如果参数是int val 并且你在函数中做了val = 42;,你会期望调用者的变量被修改吗?不,你不会,因为调用者参考没有提供val。指针也不例外。要么通过引用传递指针,要么利用其他未使用的返回类型将生成的根值传回给调用者。
  • 关于另一个主题(start + end) / 2 可能会溢出

标签: c++ pointers recursion tree nodes


【解决方案1】:

在 C++ 中,参数是按值传递的。当你有

void foo(sometype x) {
    x = something;    // modifies the local x
}

那么x的修改将只在函数内部可见,因为它是在函数本地的x上进行的。指针也不例外。如果要修改原始参数,则需要通过引用传递:

void bar(sometype& x) {
    x = something;   // modifies the object refered to by x
}

TL;你需要的DR

void helper(vector<int>& nums, int start, int end, TreeNode*& root){
       ....

PS:我想您的困惑源于指针允许您修改指针的事实。指针的副本指向同一个对象,因此...

void moo(int* x) {
    *x = 42;        // modifies the int pointed to by x
}

int a = 0;
int* p = &a;
moo(p);             // x above is a copy of p

不过,一般来说应该首选引用(除非nullptr 是一个有效参数)。此外,您要修改指针而不是指针。

【讨论】:

    【解决方案2】:

    将其作为参考传递给辅助函数

    不,指针本身是按值传递的。参数root只是参数的一个副本,函数内部对指针本身的任何修改都与参数无关。

    将其更改为传递引用:

    void helper(vector<int>& nums, int start, int end, TreeNode*& root){
    //                                                          ^
        if(start >= end) return;
        root = new TreeNode;
        int median = (start + end) / 2;
        root -> val = nums[median];
        helper(nums, start, median - 1, root -> left);
        helper(nums, median + 1, end, root -> right);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-05
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 2020-09-29
      • 2021-02-13
      • 2012-11-27
      • 2018-05-22
      • 1970-01-01
      相关资源
      最近更新 更多