这是我的插入函数的第一部分
void BinTree::insert(Node * temp, NodeData * insData)
{
if (temp == NULL)
{
temp = new Node;
temp->pData = insData;
temp->left = NULL;
temp->right = NULL;
return;
}
//recursively go left or right
//....rest of the function
}
问题在于第一个if语句。我正在添加几个节点。
这是调用插入函数的函数。
void BinTree::insertMiddle(NodeData* arr[], int bottom, int top)
{
if (bottom <= top)
{
int middle = (bottom + top) / 2;
if (arr[middle] == NULL)
{
return;
}
else
{
insert(root, arr[middle]);
arr[middle] = NULL;
insertMiddle(arr, bottom, middle - 1);
insertMiddle(arr, middle + 1, top);
}
}
else
{
return;
}
}
我发现插入所有节点后,root仍为NULL。实际上,insert函数中的第一个if语句每次都变为true。
第一次插入后,它不应为null。
我不认为我在任何地方删除任何内容或将root设置为NULL。
代码出了什么问题?
答案 0 :(得分:2)
我无法验证代码的正确性,但我认为我现在看到了您遇到的问题。 insert
将一个指针temp
带到一个节点,将其更改为某个已分配的new
节点。但是指针temp
是按值传递的,因此函数insert
temp = new Node;
在调用者处不可见,因为它会更改传递参数的副本。当你用
打电话时insert(root, arr[middle]);
在函数temp
内更改参数insert
(按值传递)不会更改调用者中root
的值。
如果希望函数insert
更改调用者传递的参数,请更改其原型以通过引用传递参数:
void BinTree::insert(Node*& temp, NodeData * insData)
^^^
这样,temp是pointer-to-Node
类型的参数,并通过引用传递。因此,在调用者代码中可以看到对指针的任何更改。