簡體   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