使用二叉树的模板作为优先级队列
所以,我想打一个代码,创建一个二叉树,保存数据,例如整数像1,6,2,10,8和流行音乐我得到的最大数字,然后它从树中删除,并推我可以插入一个新的元素。这应该是在模板中,所以我可以很容易地改变我想要保存在树中的数据类型。现在我到目前为止,没有模板它是工作好思想,我可以添加项目,我可以打印它们,但是当我尝试把它放在模板中,我得到以下错误:使用类模板需要模板参数列表。可能是什么问题呢?也许我这样做完全错了。欢迎任何建议。使用二叉树的模板作为优先级队列
这是我的第一个问题就得到了由avakar TY固定。 (我会在我的问题结束后张贴代码)
我刚刚读了槽的项目请求,和它一样,我不得不让这个东西我在上面描述的问题的第一部分,但它像二进制树应该代表一个优先级队列。这就是为什么在写请求时,我必须使用push按优先级顺序在树中放置一个新元素,并使用弹出窗口,我将获得具有最高优先级的元素,然后该元素将被删除。那么我怎样才能将我的树用作优先队列呢,还是他已经是一个(我认为不是但是谁知道)?我希望我能解释它。
这里是如许的代码:
#include <iostream>
using namespace std;
template<class T>
class BinaryTree
{
struct Node
{
T data;
Node* lChildptr;
Node* rChildptr;
Node(T dataNew)
{
data = dataNew;
lChildptr = NULL;
rChildptr = NULL;
}
};
private:
Node* root;
void Insert(T newData, Node* &theRoot)
{
if(theRoot == NULL)
{
theRoot = new Node(newData);
return;
}
if(newData < theRoot->data)
Insert(newData, theRoot->lChildptr);
else
Insert(newData, theRoot->rChildptr);;
}
void PrintTree(Node* theRoot)
{
if(theRoot != NULL)
{
PrintTree(theRoot->lChildptr);
cout<< theRoot->data<<" ";;
PrintTree(theRoot->rChildptr);
}
}
public:
BinaryTree()
{
root = NULL;
}
void AddItem(T newData)
{
Insert(newData, root);
}
void PrintTree()
{
PrintTree(root);
}
};
int main()
{
BinaryTree<int> *myBT = new BinaryTree<int>();
myBT->AddItem(1);
myBT->AddItem(7);
myBT->AddItem(1);
myBT->AddItem(10);
myBT->AddItem(4);
myBT->PrintTree();
}
如果你想使用二叉树作为优先级队列,您只能通过右子指针步进提取最大元素。任何留下的孩子都会比当前元素小。因此,您记录该节点的值,然后将其删除 - 您仍然必须编写节点删除例程。
用一个简单的BST的问题是,它可以变得不平衡,并发送你的复杂性为O(n)。您可以使用自平衡BST,但对于优先级队列来说是不常见的。正如Kerrek所说,他们通常是heaps,而不是BST。
最简单的堆实现,我个人知道的是binary heap。二进制堆在理论上是一种二叉树,虽然没有像这样存储。所以,根据你是否必须实现一个BST或者只是一个二叉树,它可能符合你的要求。
嗯好吧,现在我只是试图写一个代码来删除最大的正确的孩子,不知道我是否被允许使用堆。但是我的代码到目前为止还可以吧? –
这对我来说很好。删除最大的正确的孩子应该是非常简单的,因为它最多只有一个孩子。 – Vlad
在此行中:
BinaryTree<int> *myBT = new BinaryTree();
您还需要指定要实例化的赋值右侧的模板类型:
BinaryTree<int> *myBT = new BinaryTree<int>();
因为BinaryTree
不是BinaryTree<int>
;一个是模板的名称(BinaryTree
),另一个是该模板的特定类型的名称(BinaryTree<int>
)。你不能创建普通模板的实例,你必须给它一个你想要使用的模板的类型。
恩是的,我忘了使用固定的代码,这是我的第一个问题ty,我想我现在在这里修复它... –
嗯,好吧,我接受你的答案,导致话题将被关闭。 TY。 –
@Toma不,它还没有关闭,只有一个人投票结束它,它需要5。如果它不回答你的问题,请不要接受我的回答。确保指出你的错误发生在哪一行。 –
对不起,我正在投票结束这个问题。请随意将您的代码或有关BST的问题重新发布为优先级队列。 –
嗯...... C++标准库实现了一个优先级队列,而不是一棵树。我认为自平衡树也可以用于相同的目的,尽管树在叶节点中具有极端元素而不在根中。 –