利用BST的优先级队列-有趣的Ouptut
Priority Queue that Utilizes BST - Funny Ouptut
我编写了一个优先级队列,该队列为我的数据结构类使用二进制搜索树。它产生的输出对于某些输入是正确的,而对于其他输入则是不正确的。正确输出:
输入元素数量:5
输入编号1(共5个):1
输入编号2(共5个):2
输入编号3,共5:3
输入编号4:4
输入5:5 中的第5个
输出编号1,共5:5
输出编号2:5:4
输出编号3,共5:3
输出第4个(共5个):2
输出编号5(共5个):1
按任意键继续。
输出错误
输入元素数量:5
输入数字1(共5个):-56
输入编号2:4
输入编号3/5:56
输入第4个,共5个:21
输入5:32 中的第5个
输出编号1(共5个):56
输出编号2:5:4
输出编号3/5:-56
输出第4个(共5个):-56
输出编号5:-56
按任意键继续。
测试.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
{
public:
CTree();
~CTree();
void Add(int);
void View();
bool IsEmpty();
int DeleteLargest(TreeNode*);
TreeNode *tree;
private:
void AddItem( TreeNode*&, TreeNode*);
void DisplayTree(TreeNode*);
void Retrieve(TreeNode*&, TreeNode*,bool&);
void Destroy(TreeNode*&);
};
//#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(int dataToEnter)
{
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->info = dataToEnter;
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 = tr->info;
TreeNode* prev = NULL;
while (tr->rightLink != NULL)
{
prev = tr;
tr = tr->rightLink;
largest = tr->info;
}
if (prev != NULL && prev->rightLink != NULL)
{
delete prev->rightLink;
prev->rightLink = NULL;
}
return largest;
}
//
//int CTree::DeleteLargest(TreeNode* tr)
//{
// int largest = 0;
// TreeNode* prev = NULL;
//
//
// while (tr->rightLink != NULL)
// {
// prev = tr;
// tr = tr->rightLink;
// largest = tr->info;
// }
//
// prev->rightLink = NULL;
//
// return largest;
//}
/*
if (tr == NULL)
{
cout << "The tree is empty"<<endl;
}
else if (tr->rightLink == NULL)
{
largest = tr->info;
prev->rightLink = NULL;
}
else
{
prev = tr;
tr = tr->rightLink;
largest = DeleteLargest(tr);
}
*/
PQ申报
//#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
PQ实施
#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(dataToEnter);
}
int PriorityQueueBST::Dequeue()
{
//check for empty??
return ourTree->DeleteLargest(ourTree->tree);
}
bool PriorityQueueBST::IsEmpty()
{
return ourTree->IsEmpty();
}
在DeleteLargest
中,考虑如果树看起来像会发生什么
4
/
/
2 7
/ /
1 3 5
带
int CTree::DeleteLargest(TreeNode* tr)
{
int largest = tr->info;
TreeNode* prev = NULL;
while (tr->rightLink != NULL)
{
prev = tr;
tr = tr->rightLink;
largest = tr->info;
}
if (prev != NULL && prev->rightLink != NULL)
{
delete prev->rightLink;
prev->rightLink = NULL;
}
return largest;
}
你找到了7,但把树上的5去掉,它就丢了。当根节点的右子树已经被完全删除时,tr->rightLink
从一开始就是NULL
,所以prev
保持为NULL
,不删除任何内容。
对于第一种情况,在删除tr
之前,必须将tr
的左侧子项移植到prev
的右侧。第二种情况有点复杂。由于在不更改函数签名的情况下无法更改包含的CTree
,因此无法删除传入的根节点。您必须通过复制其左子节点的值、重新链接其子节点并删除原始左子节点来伪造它。
cco当然还有其他可用的方法,但我能想到的只是复制一个info
并删除一个不同的节点。
相关文章:
- boost::进程间消息队列引发错误
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Android NDK传感器向事件队列报告奇怪的间隔
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 在一个读写器队列中,我可以用volatile替换原子吗
- 为什么我的多线程作业队列崩溃
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 使用"Task"函数指针队列定义作业管理器
- 在c++队列中使用pop和visit实现线程安全
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 共享队列的线程安全
- 带自定义比较器的最小优先级队列
- 在 Vulkan Qt 中获取队列系列
- 堆栈和队列是否像C++中的数组一样传递?
- 在C++中创建队列 - 什么是 malloc 错误?
- 利用BST的优先级队列-有趣的Ouptut