在模板中使用二进制树作为优先级队列

时间:2011-11-18 19:36:31

标签: c++ templates binary-tree priority-queue

所以我想创建一个代码,创建一个包含数据的二叉树,例如像1,6,2,10,8这样的整数,在pop上我得到最大的数字,然后它被删除树,在推我可以插入一个新元素。这应该在一个模板中,这样我就可以轻松更改我想要在树中保存的数据类型。现在我得到了树到目前为止,没有模板它工作正常,我可以添加项目,我可以打印它们,但是当我尝试将它放在模板中时,我得到以下错误:使用类模板需要模板参数列表。可能是什么问题呢?也许我做错了。欢迎任何建议。

这是我的第一个问题,由avakar ty修复。 (我将在我的问题末尾发布代码)

我只是通过项目请求阅读,就像我在上面描述的问题的第一部分中所做的那样,但是它就像二叉树应该代表一个优先级队列。这就是为什么在写入请求时我必须使用push按优先级顺序在树中放置一个新元素,并且使用pop我将获得具有最高优先级的元素,然后该元素将被删除。那么我怎么能用我的树作为优先级队列,或者他已经是一个(我想不是但谁知道)?我希望我能解释一下。

以下是承诺的代码:

#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();
    } 

2 个答案:

答案 0 :(得分:1)

在这一行:

BinaryTree<int> *myBT = new BinaryTree();

您还需要在作业的右侧指定要实例化的模板类型:

BinaryTree<int> *myBT = new BinaryTree<int>();

因为BinaryTree不是BinaryTree<int>;一个是模板的名称(BinaryTree),一个是该模板的特定类型的名称(BinaryTree<int>)。您无法创建普通模板的实例,您必须为其提供您想要一直使用的模板类型。

答案 1 :(得分:1)

如果要将二叉树用作优先级队列,则只能通过右子指针来提取最大元素。任何左子都比当前元素小。因此,您记录该节点的值,然后将其删除 - 您仍然需要编写节点删除例程。

简单BST的问题在于它可能变得不平衡并将您的复杂性发送到O(n)。您可以使用自平衡BST,但优先级队列不常见。正如Kerrek所说,它们通常是heaps而不是BST。

我个人认识的最简单的堆实现是binary heap。二进制堆理论上是一种二叉树,尽管不是这样存储的。因此,根据您是否必须实现BST或仅仅是二叉树,它可能符合您的要求。