为什么应该通过引用调用此函数?

时间:2016-04-14 04:55:57

标签: c++ tree binary-tree

我有一段这样的代码(实现Tree)

struct Node
{
   int val;
   struct node* left,*right;
   Node(int x){
     val=x;
     left=right=NULL;
   }
};

void insert(Node* &h,int val){
  if(h==NULL){
    h=new Node(val);
    return; 
  }
  if(h->val > val){
    insert(h->left,val);
  }
  else {
     insert(h->right,val);
  }
} 

void temp(Node* h,int val){        // Node* h doesn't seem to work but
                                   // Node*& h does!!!
     insert(h,val);
}

int main() {

struct Node* R=NULL;
for(int i=0;i<5;i++){
  cin>>x;
  temp(R,x);
}
  return 0; 
}

请忽略小错误和其他正式包括库(此代码不用于编译)。

我的问题是: - 为什么地址需要在上述行中通过引用传递?

我的观点:我正在从main到temp函数发送Root的地址,然后temp函数通过引用将该地址发送到插入函数以插入函数这是永久改变它,为什么不在这里改变根的地址?如果这是一个错误而不是在这里实际改变了哪个地址?

2 个答案:

答案 0 :(得分:0)

因为,否则参数将按值传递。因此,在R / temp()返回后,main的insert()或其他任何树的根节点将保持完全不变。

如果它最初为NULL,则在NULL返回后它仍然是temp(),甚至,假设已插入新节点作为根节点。所发生的一切都是参数的值副本被更新,而不是真正的根节点,泄漏内存。

答案 1 :(得分:0)

由于temp函数将h作为对指针的引用,该程序将导致分段错误。

将临时功能的签名更改为void temp(Node* &h, int val),它将起作用。

insert函数为h分配内存,但temp函数将编译器内部创建的临时变量传递给insert函数