二进制搜索树忘记我添加的每个节点

Binary Search Tree Forgetting Every Node I Add

本文关键字:节点 添加 搜索树 忘记 二进制      更新时间:2023-10-16

我的问题看起来很简单,但我找不到解决方案。我有一个二叉树,这是我的加法函数:

void collection::addToTree(vendor *& item)
{
    Node * curr = root;
    while (curr)
    {
        if (strcmp(item->getName(), root->item->getName()) < 0)
            curr = curr->left;
        else
            curr = curr->right;
    }
    curr = new Node(item);
}

这是我的Node构造函数:

collection::Node::Node(vendor *& item) : left(nullptr), right(nullptr)
{
    this->item = item;
}

然而,无论我试图向树中添加什么或多少项,树总是空的。我能想到的唯一一段能帮助你们的代码是我的树的struct

struct Node
{
    Node();
    Node(vendor *& item);
    vendor * item;
    Node *left, *right;
};
Node * root;

vendor的所有子变量都有值(正如我在调试器中看到的)。我希望我能给你们更多的细节,但这是我所知道的关于错误的全部。非常感谢您的反馈。

add函数中,您只使curr指向新项,但这不会更改回以前的左/右指针,这可能就是您的目标。

您需要直接修改左/右指针,如下所示:

void collection::addToTree(vendor *& item)
{
    Node * curr = root;
    while (curr)
    {
        if (strcmp(item->getName(), curr->item->getName()) < 0)
        {
            if (!curr->left)
            {
                curr->left = new Node(item);
                return;
            }
            curr = curr->left;
        }
        else
        {
            if (!curr->right)
            {
                curr->right = new Node(item);
                return;
            }
            curr = curr->right;
        }
    }
    root = new Node(item);
}

此外,请确保执行Node * root = nullptr,因为不初始化它可能会导致它包含任何任意值。

注意,我还将if (strcmp(item->getName(), root->item->getName()) < 0)更改为if (strcmp(item->getName(), curr->item->getName()) < 0),因为分支依赖于curr,而不是root

我认为这里的问题是,您的curr变量应该声明为Node **curr,并接收根的地址,以便在addToTree函数之外可见更改。

void collection::addToTree(vendor *& item)
{
    Node ** curr = &root;
    while (*curr)
    {
        if (strcmp(item->getName(), (*curr)->item->getName()) < 0)
            (*curr) = (*curr)->left;
        else
            (*curr) = (*curr)->right;
    }
    *curr = new Node(item);
}