#include <cstdio>#include<iostream>#include<cstring>#include<cmath>#include<string>#include<cstdlib>#include<algorithm>using namespacestd;template<classElem>classpriorityqueue{Private: structNode {node*Left ; Node*Right ; Elem data; intNPL; Node (node* Left_i, node* right_i, Elem data_i,intnpl_i): Left (left_i), right (right_i), data (data_i), NPL (npl_i) {}}; Node*Root; intcurrentsize; Public: Node*Getroot () {returnRoot; } intsize () {returncurrentsize; } priorityqueue () {currentsize=0; Root=NULL; } Priorityqueue (Node* p,intsize) {CurrentSize=size; Root=p; } priorityqueue (Elem data) {currentsize=1; Root=NewNode (null, NULL, data,0); } ~Priorityqueue () { while(currentsize) dequeue (); } voidSwap (node*p) {node* tmp = p->Left ; P->left = p->Right ; P->right =tmp; } voidenqueue (elem data) {node* p =NewNode (null, NULL, data,0); Root=merge (root, p); CurrentSize++; } elem Dequeue () {elem tmp= root->data; Node* del =Root; Root= Merge (Root->left, root->Right ); Deletedel; CurrentSize--; returntmp; } StaticPriorityqueue Treemerge (priorityqueue& N1, priorityqueue&n2) { returnPriorityqueue (N1.merge (N1.getroot (), N2.getroot ()), n1.size () +n2.size ()); } node* Merge (node* N1, node* n2)//whether continue or direction? (minimum leftist heaps) { if(N1 = =NULL)returnN2; if(N2 = =NULL)returnN1; if(N1->data < n2->data) {mergeoperate (n1, N2); returnN1;// } Else{mergeoperate (N2, N1); returnN2;//}} node* Mergeoperate (node* N1, node*n2) { if(N1->left = =NULL) {N1->left =N2; returnN1; } Else{N1->right = Merge (n1->Right , N2); if(N1->LEFT->NPL < n1->right->NPL) {Swap (N1); } N1->NPL = N1->RIGHT->NPL +1; } returnN1; }};
Left heap Priority Queue class template merge sort