【发布时间】:2017-06-15 10:43:04
【问题描述】:
我编写了两种不同的代码来插入二叉树,一种有效,另一种无效。
这是我的节点的样子:
struct node
{
int data;
node *left;
node *right;
};
以下是node* newnode(int a)的代码
node* newnode(int a)
{
node *temp=new node;
temp->data=a;
temp->left=nullptr;
temp->right=nullptr;
return temp;
}
以下是两种不同的插入代码:
这个返回一个指向节点的指针:
node* insertion(node *root, int a)
{
if(root==nullptr)
return newnode(a);
else if(a<root->data)
root->left=insertion(root->left, a);
else
root->right=insertion(root->right, a);
}
这个返回void:
void insertion2(node *root,int a)
{
if(root==nullptr)
root=newnode(a);
else if(a<root->data)
insertion2(root->left,a);
else
insertion2(root->right,a);
}
返回 void 的那个不起作用。根据我的分析,在函数调用之后,root 仍然是nullptr。谁能解释一下为什么它不起作用?
【问题讨论】:
-
这里
root在函数中被修改,对main中的root没有影响。上面的函数调用修改了函数局部的变量,整体没有影响 -
我认为这是问题所在,但后来我认为将函数参数作为指针传递是一种通过引用传递的方法。因此,在函数
insertion2中对root所做的任何更改也应该在main中可见(root是指向node的指针)。还是我都搞错了? -
不,这里不是这样。看看你是否对
root指向的数据(类似于*root = something)进行了任何更改,那么只有它在root的main's副本中可见,但在这里你正在对root本身进行更改。这里地址本身是按值传递的,因此对root所做的任何更改都将是函数的本地变量。 -
insertion肯定也坏了。root ! =nullptr所在的任何分支都没有return,因此行为未定义。 -
您可能希望接受给出的答案之一。只是对回答的人行屈膝礼。
标签: algorithm c++11 data-structures binary-search-tree