广度对二进制搜索树的首次搜索

Breadth First Search of Binary Search Tree

本文关键字:搜索 搜索树 二进制      更新时间:2023-10-16

我正在尝试为二进制搜索树制作广度的第一个搜索功能,但是我似乎无法使其正常工作。任何指针都将不胜感激!

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

由于BST<T>节点具有有关其孩子的信息,因此您必须将它们放在队列上,而不是像您一样的值。另一件事是,在弹出之前,您不会从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;
}

几件事:

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

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

您的队列也应为节点类型,您应该在队列中插入节点:

队列*>队列;

最后,您无法访问脱离元素,您需要使用队列类的front方法在调用POP之前访问前元素。