【问题标题】:C++: Inserting objects in a Binary Search Tree using recursionC++:使用递归在二叉搜索树中插入对象
【发布时间】:2013-10-28 21:19:45
【问题描述】:

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

有人能看出我的代码有什么明显错误吗?

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

【问题讨论】:

  • newNode &lt; root 比较两个指针。你想要的是比较两个BTnode&lt;Item&gt;s。指针比较是否适当重载?
  • 请附上您的重载运营商代码
  • 更好的是,提供Short, Self Contained, Correct Example
  • 奥斯瓦尔德,你是对的,我没有注意到这一点。我最初是在比较项目,但在我更改函数以将两个节点作为参数后重写了它但即使在比较项目时它也一样

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


【解决方案1】:

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

你的签名

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

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

我建议以下方法:

  • 将递归移到BTnode 类中
  • 递归函数将const Item&amp; 作为参数
  • 如果递归函数应该进入没有分支的分支,它会从Item 创建BTnode,并将适当的成员变量设置为新创建的BTnode
  • 确保BTnode 的析构函数销毁了它的两个孩子。
  • 禁止复制或编写适当的复制构造函数和复制赋值运算符(请参阅Rule of Three)。

【讨论】:

  • 我不确定我是否理解。如果 root->left()==NULL,并且我将它作为参数传递,那么在循环函数上,第一个 if 语句将为真,并将该 root 设置为 hewNode?​​span>
  • 在每个insert 调用之前和之后放置std::cout &lt;&lt; root-&gt;left() &lt;&lt; ':' &lt;&lt; root-&gt;right();,看看会发生什么。
  • 它根本没有打印任何正确的航班......嗯。事实上,它们都是 Flight 的空(默认构造函数)值。感谢您的帮助 Oswald,我将深入挖掘
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 2011-12-15
  • 2015-06-16
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多