将节点插入BST

布拉斯克

这是我插入功能的第一部分

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章