1、概念:斜堆是左式堆的自调节形式,实现简单,是特殊的二叉树,其与左式堆的关系类似伸展树与AVL树之间的关系。
2、结构:是二叉树的结构,与左式堆不同,没有Npl。
3、操作:在合并时,将较大堆和较小堆的右子树合并,然后交换较小堆的左右子树。其余操作基本一致。
4、代码实现:
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; struct Node{ int data; struct Node *Left,*Right; }; typedef struct Node* Skew_Heap; bool IsEmpty(Skew_Heap H) { return H==NULL; } Skew_Heap Merge(Skew_Heap T1,Skew_Heap T2) //斜堆的合并 { Skew_Heap tmp; if(T1==NULL) return T2; if(T2==NULL) return T1; if(T1->data>T2->data){ tmp=T1;T1=T2;T2=tmp; } tmp=Merge(T1->Right,T2); T1->Right=T1->Left; T1->Left=tmp; return T1; } Skew_Heap Insert(int x,Skew_Heap H) //斜堆的插入 { Skew_Heap tmp=new Node; if(tmp==NULL) printf("Out of Space"); else{ tmp->data=x; tmp->Left=tmp->Right=NULL; H=Merge(tmp,H); } return H; } Skew_Heap DeleteMin(Skew_Heap H) //斜堆的的删除最小元素 { if(IsEmpty(H)){ printf("ERROR"); return NULL; } Skew_Heap L=H->Left,R=H->Right; delete H; return Merge(L,R); } void InOrder(Skew_Heap H) //斜堆的中序遍历 { if(H){ InOrder(H->Left); printf("%d ",H->data); InOrder(H->Right); } } int main(void) { Skew_Heap H=NULL; int n=7,i,x=-1; for(i=0;i<n;i++){ x*=(-1); H=Insert(i*i+x,H); } InOrder(H); return 0; }
参考文章:传送门