将节点插入BST

时间:2017-01-29 15:45:21

标签: c++ pointers recursion binary-search-tree

这是我的插入函数的第一部分

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。

代码出了什么问题?

1 个答案:

答案 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类型的参数,并通过引用传递。因此,在调用者代码中可以看到对指针的任何更改。