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

C++ different output using global variables vs passing variable thorugh function

我正在解决 this 个问题。

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相同的值,在这一层被更新(或者不更新,来自上一层),被传递给两次调用。 maxtravRight.

也会发生同样的事情

这就是区别。

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

@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 设置为临时值的引用,这不起作用。

有关更多信息,请考虑:Default value to a parameter while passing by reference in C++