左式堆 优先级队列类模板 归并排序

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <cstdlib>
#include<algorithm>
using namespace std;


template <class elem>
class priorityqueue
{
private:
    struct node
    {
        node* left;
        node* right;
        elem data;
        int npl;
        node(node* left_i, node* right_i, elem data_i, int npl_i) :left(left_i), right(right_i), data(data_i), npl(npl_i) {}
    };
    node* root;
    int currentsize;
public:
    node* getroot()
    {
        return root;
    }
    void setroot(node* p)
    {
        root = p;
    }
    int size()
    {
        return currentsize;
    }
    void setsize(int k)
    {
        currentsize = k;
    }
    priorityqueue()
    {
        currentsize = 0;
        root = NULL;
    }
    priorityqueue(node* p, int size)
    {
        currentsize = size;
        root = p;
    }
    priorityqueue(elem data)
    {
        currentsize = 1;
        root = new node(NULL, NULL, data, 0);
    }
    void deletedata(node* &root)
    {
        if (root->left != NULL)
            deletedata(root->left);
        if (root->right != NULL)
            deletedata(root->right);
        delete root;
        root = NULL;

    }
    ~priorityqueue()
    {
        deletedata(root);
    }
    void swap(node* p)
    {
        node* tmp = p->left;
        p->left = p->right;
        p->right = tmp;
    }

    void enqueue(elem data)
    {
        node* p = new node(NULL, NULL, data, 0);
        root = merge(root, p);
        currentsize++;
    }

    elem dequeue()
    {
        elem tmp = root->data;
        node* del = root;
        root = merge(root->left, root->right);
        delete del;
        currentsize--;
        return tmp;
    }

    static node* treemerge(priorityqueue& n1, priorityqueue& n2)
    {
        int size = n1.size() + n2.size();
        n1.setsize(size);
        n2.setsize(size);
        return n1.merge(n1.getroot(), n2.getroot());
    }
    /*
    priorityqueue operator= (priorityqueue &other)
    {
        if (&other == this) return *this;
        deletedata(root);
        currentsize = 0;
        while (other.size())
            enqueue(other.dequeue());
        return *this;
    }
    */
    node* merge(node* n1, node* n2)//whether continue or direction? (minimum leftist heaps)
    {
        if (n1 == NULL)
            return n2;
        if (n2 == NULL)
            return n1;
        if (n1->data < n2->data)
        {
            mergeoperate(n1, n2);
            return n1;//
        }
        else
        {
            mergeoperate(n2, n1);
            return n2;//
        }
    }
    node* mergeoperate(node* n1, node* n2)
    {
        if (n1->left == NULL)
        {
            n1->left = n2;
            return n1;
        }
        else
        {
            n1->right = merge(n1->right, n2);
            if (n1->left->npl < n1->right->npl)
            {
                swap(n1);
            }
            n1->npl = n1->right->npl + 1;
        }
        return n1;
    }


};

 

posted @ 2016-04-23 11:59  Chips丶  阅读(220)  评论(0编辑  收藏  举报