C++:我的新节点在哪里

C++: where are my new nodes?

本文关键字:节点 在哪里 我的 新节点 C++      更新时间:2023-10-16

我正在尝试使用二进制树在集合中添加元素:

bool TreeSet::add(const string &str)
{
    if (treesize == 0)
    {
        TreeNode->data = str;
        treesize++;
        return true;
    }
    else
    {
        if (str < TreeNode->data)
            return insert(TreeNode->left, str);
        else if (str > TreeNode->data)
            return insert(TreeNode->right, str);
        else
            return false;
    }
    return false;
}
bool TreeSet::insert(TREE *node, const string &str) //private
{
    if (node == NULL)
    {
        node = new TREE;
        node->data=str;
        node->left = NULL;
        node->right = NULL;
        treesize++;
        return true;
    }
    else
    {
        if (str < node->data)
            return insert(node->left, str);
        else if (str > node->data)
            return insert(node->right, str);
        else
            return false;
    }
    return false;
}

正如你所看到的,我想在insert内部初始化一个TREE结构,当我完成这项工作时,我想将它与树的左节点或右节点链接。

但是当我gdb这个时,只能构造一个级别的树(顶层),无论我试图添加多少字符串,*left*right节点都是NULL。为什么?

我的树是:

typedef struct tree
{
    string data;
    tree *left;
    tree *right;
} TREE;
bool TreeSet::insert(TREE *node

应该是

bool TreeSet::insert(TREE *&node

指针也可以通过引用传递,如果您打算直接修改它们,则应该通过引用传递。否则,您通过副本,现在有两个指针指向同一位置。当您将复制的指针用于new以获得一些数据时,它现在指向一个新的内存位置,使您的原始指针仍为NULL(C++11中的nullptr

<小时>

附带说明一下,当构建树时,您可能应该将leftright初始化为NULL(C++11中的nullptr):

typedef struct tree
{
    string data;
    tree *left;
    tree *right;
    tree():left(NULL),right(NULL){}
} TREE;

当您在函数insert中传递指针作为参数时,如下所示:

bool TreeSet::insert(TREE* node, const string& str);

则指针被复制到参数CCD_ 12中。将node指向其他对象只会指向指针的本地副本。从调用站点传递到函数的指针是未更改的

node = new TREE; // Points local variable 'node' to newly allocated data.
                 // When the function goes out of scope 'node' will be destroyed
                 // and the memory will be leaked.

要更改原始调用站点指针指向的位置,请通过引用获取参数(或添加另一个间接级别):

bool TreeSet::insert(TREE*& node, const string& str);

通过引用参数,可以确保访问的是调用站点变量,而不是本地副本。