使用 BST 的优先级队列 -- 删除最大不起作用

Priority Queue that utilizes BST -- DeleteLargest doesn't work

本文关键字:删除 不起作用 队列 BST 优先级 使用      更新时间:2023-10-16

我正在创建一个优先级队列,该队列利用我的数据结构类的二叉搜索树。 但是当我尝试输出队列时,我总是得到 0。 我已经查看了我的删除最大和取消排队成员函数,但我找不到错误

测试.cpp

#include <iostream>
#include "CTree.h"
#include "PriorityQueueBST.h"
using namespace std;
int main()
{
    int num, input, output;
    cout << "Enter number of elements: ";
    cin >> num;
    PriorityQueueBST p;
    for (int x = 0; x < num; x++)
    {
        cout << "Enter number " << x + 1  
            << " of " << num << ": ";
        cin >> input;
        p.Enqueue(input);
    }
    for (int y = 0; y < num; y++)
    {
        cout << "Outputting number " << y + 1  
            << " of " << num << ": ";
        if(p.IsEmpty())
        {
            break; //we are done (this is an error!)
        }
        output = p.Dequeue();
        cout << output << endl;
    }
    system("pause");
    return 0;
    //CTree* tr = new CTree();
    //
    //for (int i = 0; i < 3; i++)
    //  tr->Add();
    //tr->View();
    //system("pause");

    //return 0;
}

BST 声明文件

//#ifndef CTREE_H
//#define CTREE_H
//using namespace std;
struct TreeNode
{
    int info;
    TreeNode* leftLink;
    TreeNode* rightLink;
};

class CTree
{
private:

    void AddItem( TreeNode*&, TreeNode*);
    void DisplayTree(TreeNode*);
    void Retrieve(TreeNode*&, TreeNode*,bool&);
    void Destroy(TreeNode*&);
public:
    CTree();
    ~CTree();
    void Add();
    void View();
    bool IsEmpty();
    int DeleteLargest(TreeNode*&);
    TreeNode *tree;
};

//#endif

BST 实现文件

#include <iostream>
#include <string>
using namespace std;
#include "CTree.h"
CTree::CTree()
{
    tree = NULL;
}
CTree::~CTree()
{
    Destroy(tree);
}
void CTree::Destroy(TreeNode*& tree)
{
    if (tree != NULL)
    {
    Destroy(tree->leftLink);
    Destroy(tree->rightLink);
    delete tree;
    }
}

bool CTree::IsEmpty()
{
    if(tree == NULL) 
    {
        return true;
    }
    else
    {
        return false;
    }
}
void CTree::Add()
{
    TreeNode* newPerson = new TreeNode();
    /*cout << "Enter the person's name: ";
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
    cin.getline(newPerson->name, 20);*/
   /* cout << "Enter the person's contribution: ";
    cin >> newPerson->info;*/
    /*bool found = false;*/

    newPerson->leftLink = NULL;
    newPerson->rightLink = NULL;
    /*Retrieve(tree, newPerson, found);
     if (found)
         cout << "info allready enteredn";
     else*/
         AddItem(tree, newPerson);
}
void CTree::View()
{
    if (IsEmpty())
    {
        cout<<"The list is empy";
    }
    else
    {
        DisplayTree(tree);
    }
};
void CTree::AddItem( TreeNode*& ptr, TreeNode* newPer )
{
        if (ptr == NULL)
        {
            ptr = newPer;
        }
        else if ( newPer->info < ptr->info)
            AddItem(ptr->leftLink, newPer); 
        else
            AddItem(ptr->rightLink, newPer); 
}
void CTree::DisplayTree(TreeNode* ptr)
{
    if (ptr == NULL)
                    return;
    DisplayTree(ptr->rightLink);
    cout << ptr->info << endl; //cout<<ptr->name<<" "<<"$"<<ptr->info <<endl;
    DisplayTree(ptr->leftLink); 
}
void CTree::Retrieve(TreeNode*& ptr, TreeNode* newPer, bool& found)
{
    {
        if (ptr == NULL)
        {
            found = false; // item is not found.
        }
        else if ( newPer->info < ptr->info)
        {
            Retrieve(ptr->leftLink, newPer, found);
        }
             // Search left subtree.
        else if (newPer->info > ptr->info)
        {
            Retrieve(ptr->rightLink, newPer, found);// Search right subtree.
        }   
        else
        {
            //newPer.info = ptr->info; // item is found.
            found = true;
        }
    }
}
int CTree::DeleteLargest(TreeNode*& tr)
{
    int largest = 0;;
    TreeNode* prev;
    TreeNode* cur;
    prev = NULL;
    cur = tr;
    if (tr == NULL)
    {
        cout <<  "The tree is empty"<<endl;
    }
    else if (tr->rightLink == NULL)
    {
        largest = tr->info;
    }
    else
    {
        prev = tr;
        tr = tr->rightLink;
        DeleteLargest(tr);
    }
    return largest;
}

优先级队列声明

//#include <iostream>
//using namespace std;
//#include "SortedLinkedList.h"
#ifndef PRIORITYQUEUESLL__H
#define PRIORITYQUEUESLL__H
class PriorityQueueBST
{
    public:
        PriorityQueueBST();
        ~PriorityQueueBST();
        void Enqueue(int);
        int Dequeue();
        bool IsEmpty();
    private:
        CTree* ourTree;
        //sslNode* head;
};
#endif

优先级队列实施

#include <iostream>
using namespace std;
#include "CTree.h"
#include "PriorityQueueBST.h"
PriorityQueueBST::PriorityQueueBST()
{
    ourTree = new CTree();
    //head = NULL;
}
PriorityQueueBST::~PriorityQueueBST()
{
}
void PriorityQueueBST::Enqueue(int dataToEnter)
{
    ourTree->Add();
}
int PriorityQueueBST::Dequeue()
{
    //check for empty??
    return ourTree->DeleteLargest(ourTree->tree);
}
bool PriorityQueueBST::IsEmpty()
{
    return ourTree->IsEmpty();
}

您的输出始终为 0,因为在

int CTree::DeleteLargest(TreeNode*& tr)
{
    int largest = 0;;
    TreeNode* prev;
    TreeNode* cur;
    prev = NULL;
    cur = tr;
    if (tr == NULL)
    {
        cout <<  "The tree is empty"<<endl;
    }
    else if (tr->rightLink == NULL)
    {
        largest = tr->info;
    }
    else
    {
        prev = tr;
        tr = tr->rightLink;
        DeleteLargest(tr);
    }
    return largest;
}

仅当largest NULLtr->rightlink才将设置为可能!= 0的内容。否则,您将重复并将 largest 变量设置为函数的另一个调用的本地变量。当递归再次上升时,该更改将丢失,并且在最顶层的调用中,largest仍然是 0。

else分支的最后一行中,您应该

largest = DeleteLargest(tr);

return DeleteLargest(tr);

另一个问题是,尽管它的名字,deleteLargest实际上并没有删除任何内容,所以有了上面,你仍然会得到相同的值。