我实施了BST,我的实现看起来像这样
void insert(node*&r,int key){ // 1 ) node* r 2) node*&r
if(r==NULL){
r=new node(key);
return;
}
c++;
if(r->key > key){
insert(r->right,key);
}
else if(r->key <key){
insert(r->left,key);
}
}
int main()
{
int n;
cin>>n;
node *root=NULL;
for(int i=0;i<n;i++){
int x;
cin>>x;
insert(root,x);
}
return 0;
}
我之前清楚为什么节点*&amp; 不是节点* 。但是我今天有精神障碍。如果我们使用节点*&amp,我很困惑; 比我们永久编辑根BST的身份因此我们将松开BST。另一方面,我很困惑为什么它不能使用节点* 。任何人都可以详细解释一下。哪一个和为什么?
答案 0 :(得分:1)
它现在有效,因为你通过引用传递指针,因此传递它的函数可以修改它。否则,您按值传递指针,并且在函数的退出处,不会修改作为参数传递的指针。
看看这里发生了什么:
node *root=NULL; // so initially root is nullptr
然后,在for
循环中,你有
insert(root,x); // better take it by reference, otherwise root is not modified
在插入的退出处,root
仅在通过引用传递时修改为,否则,如果按值传递,则保留NULL
。请记住,指针的行为与任何其他变量一样,在C ++中,它默认按值传递。