二叉树存储 最小堆
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;
}
因为父亲和左右孩子的编号之间有奇妙的关系,我们可以利用一维数组进行数据的存储
下面附上最小堆的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;
}
相关文章推荐
- 基于HTML5和JSP实现的图片Ajax上传和预览
- hdu 1013 digital roots(数字根)
- 图之拓扑排序(邻接表存储)
- 数据库简单概念和心得体会01
- 重换电脑,收藏JDK
- 二叉排序树的建立、查找和删除
- Java编程思想学习(十一) 泛型
- 资源网址
- Unity3D学习笔记(4)—— 牧师和魔鬼游戏
- Linux平台weblogic集群安装(三)
- Android 采用PULL来解析XML
- VC中获取字符串长度的四种类型
- 结合DAO、filter实现用户登录
- 1033. To Fill or Not to Fill (25)
- 字符集研究之不同字符集的转换方式
- C++fstream读写文件
- [2051]:Bitset
- 字符集研究之不同字符集的转换方式
- Android 之内容提供程序(Content Provider)
- C++string流之istringstream,ostringstream,stringstream类介绍