二叉树存储 最小堆

来源:互联网 发布:mac视频下载工具 编辑:程序博客网 时间:2024/05/16 06:01

最小堆相当于是一个优先队列

因为父亲和左右孩子的编号之间有奇妙的关系,我们可以利用一维数组进行数据的存储

下面附上最小堆的siftdown和siftup函数以及利用这函数进行最小堆的生成

#include"iostream"
#include"cstdio"


using namespace std;


int h[100];                   //存储数据的一维数组
int n;


void swap(int x,int y)                  //下面必要的交换函数
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
}


void siftdown(int i)                               //下沉函数,当父亲比孩子打的时候,选择最小的孩子进行交换
{
int t,flag=0;
while(2*i<=n&&flag==0)                            //含义,存在左孩子
{
if(h[i]>h[i*2])                                        //与左孩子进行大小比较
{
t=2*i;
}
else
{
t=i;

if(2*i+1<=n)                                 //是否存在右孩子
{
if(h[t]>h[2*i+1])                   //最小的数据和右孩子数据进行比较
{
t=2*i+1;
}
}
if(t!=i)                                  //存在孩子比父亲小得情况
{
swap(i,t);
i=t;
}
else
{
flag=1;
}
}
}


void siftup(int i)
{
int flag=0;
if(i==1)
{
return ;
}
else
{
while(i!=1&&flag==0)
{
if(h[i]<h[i/2])                                    //孩子比父亲小
{
swap(i,i/2);
i=i/2;
}
else
{
flag=1;

}
}
}


int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
}
for(int i=n/2;i>=1;i--)                     //对一维数组进行处理,实现构建最小数
{
siftdown(i);
}
for(int i=1;i<=n;i++)
{
printf("%d ",h[i]);
}
return 0;
}

0 0