先上代码:
void CreateTree1(TreeNode* &root) //加引用后,为变量本身。 不加引用无法达成效果
{
int val = 0;
cin >> val;
if (val == -1)
{
return;
}
root = new TreeNode();
root->value = val;
cout << "输入" << root->value << "的左孩子" << endl;
CreateTree1(root->left);
cout << "输入" << root->value << "的右孩子" << endl;
CreateTree1(root->right);
}
之前说的有误,重新写一下。
对于函数传参,有两种方式:值传递和引用传递。
对于值传递而言:传进函数体内的值,会被进行一次拷贝构造,形成一个新的变量,这个变量在函数结束后消失。
对于引用传递而言:传进函数体内的值,就是这个变量本身。
回到主题:
我们需要创建一颗二叉树,我们在函数体外声明了一个变量root,通过下面两条语句创建一颗二叉树。
TreeNode* root = NULL;
CreateTree(root);
函数实现在文章首部,读者自行阅读。本文章讨论的问题是:
void CreateTree1(TreeNode* &root);
不加 & 为什么不正确?
原因如下:
- 不加 & 符号,即为值传递,进入函数体后,生成一个新的变量来代替 root 。我们叫它 root_function,刚传递进来的时候,这两个变量内部的值一模一样,即为NULL。重点在于,root与root_function并不是同一个变量,他们的地址不一样。
- 在函数体内部,对于root_function的所有操作,都与root无关。
为什么加了 & 之后正确?
原因如下:
- 添加 & 符号后,引用传递,在函数内部不需要拷贝构造,故在堆上开辟的新空间,可以直接赋值给 root。
- 即函数内外,均为 root 。
总结:
读者可能的疑惑: 为什么链表创建时,似乎不需要传引用?
回答: 回忆一下,链表的头节点是否并没有被值传递?
综上:
- 不加引用时,函数内部会创建一个新的变量与外部的变量值完全一致,但是变量的地址不一致!!!,所以内部生成的树,映射不到外部 main 函数。
- 举个例子,root_function 接收了 new 运算符开辟的空间,而 root 依旧为NULL。