您的位置:首页 > 其它

二叉树存储 最小堆

2016-03-12 00:14 218 查看
最小堆相当于是一个优先队列

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

下面附上最小堆的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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: