当我尝试将文件添加到此树时,它只会添加为树根的子项。 比较运算符已正确重载(测试)。
任何人都可以看到我的代码明显错误吗?
template <typename Item>
void BTtree<Item>::addNode(const Item& newItem)
{
BTnode<Item> *newNode = new BTnode<Item>(newItem);
insert(newNode, root_ptr);
}
template <typename Item>
void BTtree<Item>::insert(BTnode<Item> *newNode, BTnode<Item> *root)
{
if(root == NULL)
{
root = newNode;
std::cout << "Flight added: ";
std::cout << *root << std::endl;
return;
}
else
{
if(newNode < root )
{
std::cout << "Adding "<<*newNode<< " left child of " << *root << std::endl;
insert(newNode, root->left() );
}
else
{
std::cout << "Adding "<<*newNode<<" right child of " << *root << std::endl;
insert(newNode, root->right());
}
}
}
编辑:为重载运算符提供代码
template <typename Item>
bool BTnode<Item>::operator < (const BTnode<Item>& other)
{
return ( *data < other.data );
}
对于我正在使用的对象
const bool Flight::operator < (const Flight& other) const
{
return ( (arrivalTimeHours < other.arrivalTimeHours) ||
(arrivalTimeHours == other.arrivalTimeHours &&
arrivalTimeMinutes < other.arrivalTimeMinutes)
);
答案 0 :(得分:1)
如果root->left() == NULL
,则在insert(newNode, root->left() )
之后,条件root->left() == NULL
仍然有效,因为分配root = newNode
对来电者没有任何影响。
您的签名
void BTtree<Item>::insert(BTnode<Item> *newNode, BTnode<Item> *root)
不按引用调用。它是按值调用的。只是该值恰好是指针类型。
我建议采用以下方法:
BTnode
类const Item&
作为参数BTnode
创建Item
并将相应的成员变量设置为新创建的BTnode
。BTnode
的析构函数会破坏其子代。