将对象插入二叉搜索树 - 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);
}
我对二叉搜索树还很陌生。我为二叉搜索树创建了一个模板 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);
}