【问题标题】:Inserting a node to a BST将节点插入 BST
【发布时间】:2017-06-14 19:57:45
【问题描述】:

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

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 语句每次都变为真。
第一次插入后它不应该为空。
我认为我不会在任何地方删除任何内容或将根设置为 NULL。

代码有什么问题?

【问题讨论】:

  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 重复这个:函数参数是局部变量。对局部变量的赋值对外界没有影响.
  • 我不知道指针是按值传递的。我认为这是一个新指针,但它指向传递的指针指向的同一个对象,所以没关系。不过我错了。我的错。

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


【解决方案1】:

我无法验证您的代码的正确性,但我想我看到了您目前面临的问题。 insert 将指针 temp 指向一个节点,将其更改为某个已分配的 new 节点。但是指针temp是传值的,所以函数insert里面的赋值

temp = new Node;

在调用者处将不可见,因为它更改了传递参数的副本。当你用

调用它时
insert(root, arr[middle]);

函数insert内部参数temp(传值)的变化不会改变调用者root的值。

如果你想让函数insert改变调用者传递的参数,改变它的原型来传递参数引用

void BinTree::insert(Node*& temp, NodeData * insData)
                         ^^^

这样,temp 是pointer-to-Node 类型的参数,并通过引用传递。因此,对指针的任何更改都将在调用者代码中可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多