C++使用全局变量与传递变量Thorough函数的输出不同



我正在解决这个问题。

minmax变量被设置为全局变量时,我得到了正确的输出,但当我在函数中传递它们时,会混淆输出。

我想不出原因有人能告诉我,这两个代码段有什么不同吗

global:

int min = 1,max = 0;
//dfs in which left subtree is travelled before right
void travLeft(Node * root, int i,vector<int> &left)
{
if(root==NULL) return;

if(i<min)
{
min = i;
left.push_back(root->data);
}

travLeft(root->left,i-1,left);
travLeft(root->right,i+1,left);
}

void travRight(Node * root, int i,vector<int> &right)
{
if(root==NULL) return;

if(i>max)
{
max = i;
right.push_back(root->data);
}

travRight(root->right,i+1,right);
travRight(root->left,i-1,right);
}

void topView(Node * root) {

vector<int> left,right;

travLeft(root,0,left);
travRight(root,0,right);

for(int i=left.size()-1;i>=0;i--)
{
cout<<left[i]<<" ";
}

for(int i=0;i<right.size();i++)
{
cout<<right[i]<<" ";
}

}

passing in the function :


//dfs in which left subtree is travelled before right
void travLeft(Node * root,int min, int i,vector<int> &left)
{
if(root==NULL) return;

if(i<min)
{
min = i;
left.push_back(root->data);
}

travLeft(root->left,min,i-1,left);
travLeft(root->right,min,i+1,left);
}

void travRight(Node * root,int max, int i,vector<int> &right)
{
if(root==NULL) return;

if(i>max)
{
max = i;
right.push_back(root->data);
}

travRight(root->right,max,i+1,right);
travRight(root->left,max,i-1,right);
}

void topView(Node * root) {

vector<int> left,right;

travLeft(root,INT_MAX,0,left);
travRight(root,0,0,right);

for(int i=left.size()-1;i>=0;i--)
{
cout<<left[i]<<" ";
}

for(int i=0;i<right.size();i++)
{
cout<<right[i]<<" ";
}

}

全局变量是全局变量。对该值的更改将保留在travLefttravRight的所有调用中。

另一方面,参数是函数的局部参数。minmax的新值被传递到下一级递归,但min在第一次递归中的更新

travLeft(root->left,min,i-1,left);

不会传递到第二个递归

travLeft(root->right,min,i+1,left);

因为min的相同值在这个级别上被更新(或者没有更新,并且来自上一个级别(,被传递给两个调用。CCD_ 11和CCD_。

这就是区别。

当用作全局变量时,更改将在所有层中发生(并保留更改(。但是,如果将它们传递给函数,则对于每个递归阶段(层(,变量都将具有特定的值,这些值对于特定层将保持不变。

@MikeCat和@SoumitraChatterjee已经说明了传入变量的版本无法工作的原因。

为了使其工作,您可以将参数设置为将minmax作为参考,因此更改将反映为原始值:

void travLeft(Node* root, int& min, int i, vector<int> &left) { //... }
^^^^

注意,为参数maxmin设置默认值可能很诱人,例如:

//                                                   this doesn't work
//                                                      ↓ ↓ ↓ ↓ ↓ ↓
// void travLeft(Node* root, int i, vector<int> &left, int& min = 0) 

但是,这将不起作用,因为您正试图将min设置为临时值的引用,但这不起作用。

有关这方面的更多信息,请考虑:在C++中通过引用传递时参数的默认值

相关内容

  • 没有找到相关文章

最新更新