我已经将节点指针初始化为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;
}
答案 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
是有效的参数)。此外,您要修改指针而不是指针。