为什么将节点设置为新节点后将其设置为nullptr?

时间:2020-06-27 00:33:02

标签: c++ pointers recursion tree nodes

我已经将节点指针初始化为nullptr,并将其作为引用传递给了辅助函数。在辅助函数内,我将以前为nullptr的指针设置为等于新指针。但是,函数结束后,再次将其设置为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;
}

2 个答案:

答案 0 :(得分:4)

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

否,指针本身是通过值传递的。参数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);
}

答案 1 :(得分: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是有效的参数)。此外,您要修改指针而不是指针。