二叉树、二叉堆

来源:互联网 发布:石青软件官网 编辑:程序博客网 时间:2024/03/28 23:14

妈呀,好久没写blog了……

来讲讲二叉堆


定义

二叉堆是一个完全二叉树,且每个根节点的权值<(可以重载)它的儿子节点
那么什么是完全二叉树呢?
看图找规律吧~

- 左边为满二叉树
- 右边为完全二叉树
- 红色部分表示被节点被删去

现在懂了吧!


实现

/*以下代码全部演示堆排序*/##include<iostream>#include<cstdio>#define maxn 100001using namespace std;int i,m,n,j,k;int a[maxn];int main(){    cin>>n;    for(i=1;i<=n;i++){        scanf("%d",a+i);        k=i;        while(k>1 && a[k/2]>a[k]){//构造堆            int t=a[k];            a[k]=a[k/2];            a[k/2]=t;            k/=2;        }    }    int siz=n;//堆的大小    for(i=1;i<n;i++){        printf("%d ",a[1]);        a[1]=a[siz--];//删除根节点        k=1;        while((k*2<=siz && a[k]>a[k*2]) || (k*2+1<=siz && a[k]>a[k*2+1])){            m=k*2;            if(m+1<=siz && a[m]>a[m+1])m++;            int t=a[m];            a[m]=a[k];            a[k]=t;            k=m;        }    }    cout<<a[1];    return 0;}

悄悄话:其实pb_ds和STL都自带堆,而且pb_ds的堆超级快!

rp=7/3

原创粉丝点击