【问题标题】:Breadth First Search of Binary Search Tree二叉搜索树的广度优先搜索
【发布时间】:2012-10-24 05:39:42
【问题描述】:

我正在尝试为二叉搜索树创建广度优先搜索功能,但我似乎无法使其工作。任何指针将不胜感激!

template <class T>
bool BST<T>::displayBfs(T searchKey, BST<T> *node)
{
    BST<T> *tmp = node;
    queue <int> queue;
    queue.push(node->mData);

    if (node == NULL)
    {
        return false;    
    }

    while (!queue.empty())
    {
        queue.pop();
        if (tmp->mData == searchKey)
            return true;
        else
        {
            if(tmp->mLeft != NULL)
                queue.push(tmp->mLeft->mData);
            if(tmp->mRight != NULL)
                queue.push(tmp->mRight->mData);
        }
    }
    return false;
}

【问题讨论】:

  • 有什么症状吗?是编译错误还是运行时错误?
  • 对不起,我忘了我不小心删除了那行。现在定义了 tmp。这是一个运行时错误。它只是陷入了循环。

标签: c++ binary-search-tree breadth-first-search


【解决方案1】:

由于BST&lt;T&gt; 节点具有有关其子节点的信息,因此您必须将它们放入队列中,而不是像您所做的那样将值放入队列中。另一件事是您在弹出之前没有从queue 获取元素。最后,您必须为队列指定其他名称,因为我假设您正在使用 std::queue

尝试用这种方式重写你的 BFS:

template <class T>
bool BST<T>::displayBfs(T searchKey, BST<T> *node)
{
    if (node == NULL) return false;

    queue<BST<T>*> q;
    q.push(node);

    while (!q.empty())
    {
        BST<T>* tmp = q.front();
        q.pop();

        if (tmp->mData == searchKey)
            return true;
        else
        {
            if(tmp->mLeft != NULL)
                q.push(tmp->mLeft);
            if(tmp->mRight != NULL)
                q.push(tmp->mRight);
        }
    }
    return false;
}

【讨论】:

  • 我会的。我得等几分钟。
【解决方案2】:

几件事:

node == NULL 的测试应该在您访问节点之前进行:

if (node == NULL)
    return false;    
queue.push(node);

你的队列应该是节点类型,你应该在队列中插入节点:

队列*> 队列;

最后你不是没有访问dequed元素,你需要在调用pop之前使用队列类的front方法访问前面的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多