优先队列:斜堆

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;
}
View Code

 参考文章:传送门

原文地址:https://www.cnblogs.com/2018zxy/p/10341005.html