这是我插入功能的第一部分
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;
}
}
我发现插入所有节点后,根仍然为NULL。实际上,插入函数中的第一个if语句每次都会变为true。
第一次插入后不应为null。
我认为我不会在任何地方删除任何内容或将根目录设置为NULL。
代码有什么问题?
我无法验证您的代码的正确性,但是我认为我看到了您目前面临的问题。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
并通过引用传递。因此,对指针的任何更改都将在调用者代码中可见。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句