我正在解决这个问题。
当min
和max
变量被设置为全局变量时,我得到了正确的输出,但当我在函数中传递它们时,会混淆输出。
我想不出原因有人能告诉我,这两个代码段有什么不同吗
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]<<" ";
}
}
全局变量是全局变量。对该值的更改将保留在travLeft
和travRight
的所有调用中。
另一方面,参数是函数的局部参数。min
和max
的新值被传递到下一级递归,但min
在第一次递归中的更新
travLeft(root->left,min,i-1,left);
不会传递到第二个递归
travLeft(root->right,min,i+1,left);
因为min
的相同值在这个级别上被更新(或者没有更新,并且来自上一个级别(,被传递给两个调用。CCD_ 11和CCD_。
这就是区别。
当用作全局变量时,更改将在所有层中发生(并保留更改(。但是,如果将它们传递给函数,则对于每个递归阶段(层(,变量都将具有特定的值,这些值对于特定层将保持不变。
@MikeCat和@SoumitraChatterjee已经说明了传入变量的版本无法工作的原因。
为了使其工作,您可以将参数设置为将min
和max
作为参考,因此更改将反映为原始值:
void travLeft(Node* root, int& min, int i, vector<int> &left) { //... }
^^^^
注意,为参数max
和min
设置默认值可能很诱人,例如:
// this doesn't work
// ↓ ↓ ↓ ↓ ↓ ↓
// void travLeft(Node* root, int i, vector<int> &left, int& min = 0)
但是,这将不起作用,因为您正试图将min
设置为临时值的引用,但这不起作用。
有关这方面的更多信息,请考虑:在C++中通过引用传递时参数的默认值