【问题标题】:Use Binary-Tree in Template as Priority queue使用模板中的二叉树作为优先队列
【发布时间】:2011-11-19 03:55:50
【问题描述】:

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

这是我的第一个问题,它由 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();
    } 

【问题讨论】:

  • 对不起,我投票结束这个问题。随意转发任何特定代码问题或关于 BST 作为优先级队列的问题。
  • 嗯... C++ 标准库将优先级队列实现为 而不是树。我想自平衡树也可以达到同样的目的,尽管树在叶子节点而不是根节点中有极端元素。

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


【解决方案1】:

如果您想将二叉树用作优先级队列,您可以通过仅遍历右子指针来提取最大元素。任何左子元素都将小于当前元素。所以你记录那个节点的值然后删除它——你仍然需要编写一个节点删除例程。

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

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

【讨论】:

  • 嗯好吧,现在我将尝试编写一个代码来删除最大的右孩子,因为不确定我是否可以使用堆。但是到目前为止我的代码还可以吗?
  • 我觉得不错。删除最大的右孩子应该很简单,因为它最多有一个自己的孩子。
【解决方案2】:

在这一行:

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

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

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

因为BinaryTree 不是BinaryTree&lt;int&gt;;一个是模板的名称 (BinaryTree),一个是该模板的特定类型的名称 (BinaryTree&lt;int&gt;)。你不能创建普通模板的实例,你必须给它你想要一直使用的模板类型。

【讨论】:

  • 呃,是的,我忘了使用固定代码,这是我的第一个问题,我想我现在在这里修复它以...
  • 嗯,我接受您的回答,因为该主题将被关闭。泰。
  • @Toma 不,它还不会关闭,只有一个人投票关闭它,需要 5 个。如果它不能回答您的问题,请不要接受我的回答。确保指出您的错误发生在哪一行。
  • 现在没有错误,我只是想知道,我如何从我的树中获取最高的“数字”然后删除它,如果我“推”入一个新的“ number" 我如何得到它,按优先顺序排列。
猜你喜欢
  • 2017-10-18
  • 2013-03-16
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
相关资源
最近更新 更多