C ++:使用递归在二进制搜索树中插入对象

时间:2013-10-20 11:03:48

标签: c++ templates recursion insert binary-search-tree

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

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

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

1 个答案:

答案 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的析构函数会破坏其子代。
  • 禁止复制或编写适当的复制构造函数和复制赋值运算符(请参阅Rule of Three)。