二叉树存储 最小堆
来源:互联网 发布: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;
}
- 二叉树存储 最小堆
- 二叉树 最小堆
- 最小二叉堆
- 最小二叉堆
- 数据结构二叉堆C++实现 最小堆
- 堆优先用完全二叉树表示、堆的特性和最大最小堆
- VC++2012编程演练数据结构《27》最小堆二叉树
- 最小生成树---prim模板(二叉堆优化)
- 二叉树、二叉堆
- Python实现二叉树存储结构的堆排序
- 最小堆 :完全二叉树,能方便地从中取出最小/大元素
- 最小堆/哈希表/二叉树/平衡二叉树/红黑树的意义(什么情况下使用)
- 数据结构:最小堆/哈希表/二叉树/平衡二叉树/红黑树的意义(转载)
- 数据结构:最小堆/哈希表/二叉树/平衡二叉树/红黑树的意义(使用场合)
- 最小堆/哈希表/二叉树/平衡二叉树/红黑树的意义(什么情况下使用)
- 最小堆/哈希表/二叉树/平衡二叉树/红黑树的意义
- java 实现最小二叉堆排序
- 试写二叉最小堆和最大堆
- Trianglur Design--找规律
- 揭开异常工作的恶意文档的秘密
- 分页核心SQL
- poj 1651
- cocos2dx 定时器
- 二叉树存储 最小堆
- Blog Four years
- Android 之绑定服务
- day11续—状态管理
- Android下的Button按钮点击事件
- 在Internet上快速检索信息
- 求最大字段和问题(常规法,分治法,动态规划法)
- response.encodeURL的用法
- 深入Linux网络核心堆栈(对于netfilter的用法和讲解)