繁体   English   中英

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

[英]Binary Search Tree Forgetting Every Node I Add

我的问题看似简单,但找不到解决方案。 我有一棵二叉树,这是我的添加函数:

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM