将对象插入二叉搜索树 - C++

Inserting objects into binary search tree - C++

我对二叉搜索树还很陌生。我为二叉搜索树创建了一个模板 class,以便它可以处理 class 个对象。现在我试图在 main 中测试它,我正在将文本文件中的日期读入 class 日期的 'Date' 对象,使用 while 循环直到文件末尾。第一次迭代后,当我通过 CodeBlocks 调试器检查时,我可以看到我的第一个日期已成功输入到树中。现在,在进行第二次迭代时,程序成功读取日期并将其设置为日期对象,使用我的 cout 语句输出它,然后暂停一下并崩溃。

在它暂停或崩溃的情况下,在我的调试器中,我可以看到它无休止地调用我的函数重载 'bool operator==(const Date& firstDate, const Date& secondDate)' 我用它来比较日期是否相等,无论多少次我尝试进入它不允许我进入的下一行,它只是停留在这条线上。所以我想我的运算符重载有问题吗?

卡住的函数重载:

bool operator==(const Date& firstDate, const Date& secondDate)
{
    if(firstDate==secondDate) // The debugger is pointing to this line
    {
        return true;
    }
    return false;
}

主要:

ifstream infile("date.txt");

        string date1;

        Bst<Date> dateTree;

        while(getline(infile, date1))
        {
            Date dateObj;
            stringstream date(date1);
            string day;
            string month;
            string year;

            getline(date,day,'/');
            getline(date,month,'/');
            getline(date,year, ' ');
            cout << day << endl;
            cout << month << endl;
            cout << year << endl;

            dateObj.SetDay(day);
            dateObj.SetMonth(month);
            dateObj.SetYear(year);

            dateTree.insertNode(dateObj);
        }

        dateTree.inOrderTraversal();

        return 0;
}

这是我的节点插入代码:

template <class T>
void Bst<T>::insertNode(const T& insertItem)
{
    nodeType<T> *current;
    nodeType<T> *trailCurrent = nullptr;
    nodeType<T> *newNode;

    newNode = new nodeType<T>;
    newNode->info = insertItem;
    newNode->lLink = nullptr;
    newNode->rLink = nullptr;

    if(root == nullptr)
        root = newNode;
    else
    {
        current = root;
        while(current != nullptr)
        {
            trailCurrent = current;
            if(current->info == insertItem)
            {
                cout << "The item to be inserted is already ";
                cout << "in the tree -- duplicates are not "
                << "allowed." << endl;
                return;
            }
            else if(current->info > insertItem)
                current = current->lLink;
            else
                current = current->rLink;
        }
        if(trailCurrent->info > insertItem)
            trailCurrent->lLink = newNode;
        else
            trailCurrent->rLink = newNode;

    }
}

测试firstDate==secondDate编译为:

operator==(firstDate, secondDate)

这会无限调用您的 bool operator==(const Date& firstDate, const Date& secondDate) 广告。您需要比较 Date 对象的 components。 我不知道它是如何定义的,但可能类似于以下内容:

bool operator==(const Date& firstDate, const Date& secondDate) {
    return std::tie(firstDate.year, firstDate.month, firstDate.day) == 
           std::tie(secondDate.year, secondDate.month, secondDate.day);
}