-1

当我尝试将文件添加到这棵树时,它只会添加为树根的子节点。比较运算符已正确重载(经过测试)。

任何人都可以看到我的代码有任何明显错误吗?

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

1 回答 1

1

如果root->left() == NULL,那么 之后insert(newNode, root->left() ),条件root->left() == NULL仍然成立,因为赋值root = newNode对调用者没有任何影响。

你的签名

void BTtree<Item>::insert(BTnode<Item> *newNode, BTnode<Item> *root)

不是按引用调用。这是按值调用。只是该值恰好是指针类型。

我建议采用以下方法:

  • 将递归移动到BTnode类中
  • 递归函数将 aconst Item&作为参数
  • 如果递归函数应该进入一个没有分支的分支,它会创建BTnodefromItem并将适当的成员变量设置为新创建的BTnode
  • 确保析构函数BTnode摧毁了它的两个孩子。
  • 禁止复制或编写适当的复制构造函数和复制赋值运算符(参见三法则)。
于 2013-10-20T11:23:33.290 回答