二叉堆实现

简介:

/*
** 二叉堆的实现
** 堆最重要的性质是儿子的值大于等于父亲的值。除此之外。
** 树的节点是依照从上到下,从左到右的顺序紧凑排列的。

** ** 插入:首先在末尾插入,然后不断向上提升直到没有大小颠倒为止。 ** 删除:首先把堆的最后一个元素拷贝到根节点而且删除最后一个 ** 节点。

然后不断向下交换直到没有大小颠倒为止。在向下交换过程 ** 中,假设有两个儿子,那么选择数值较小的儿子进行交换。

*/ #include <stdio.h> #include <string.h> #define maxn 1000 int heap[maxn], sz = 1; // 1为根节点 void push(int x) { int i = sz++; while(i > 1) { int p = i >> 1; // 父亲节点 if(heap[p] <= x) break; // 不再颠倒 heap[i] = heap[p]; // 把父亲节点放下,自己提上去 i = p; } heap[i] = x; } int top() { // ...须要先推断非空 return heap[1]; } int pop() { // 出队,同一时候返回队首元素 int ret = heap[1]; int x = heap[--sz]; // 要提到根的数值 int i = 1; while(i * 2 < sz) { int a = i << 1; b = i << 1 | 1; if(b < sz && heap[b] < heap[a]) a = b; if(heap[a] >= x) break; // 不再颠倒 heap[i] = heap[a]; // 把儿子的值提上来 i = a; } heap[i] = x; return ret; }



版权声明:本文博客原创文章,博客,未经同意,不得转载。



本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4640817.html,如需转载请自行联系原作者


相关文章
|
12月前
|
存储 算法 索引
【二叉树】的顺序存储(堆的实现)
【二叉树】的顺序存储(堆的实现)
77 0
|
4月前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
25 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
4月前
|
测试技术
深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度
深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度
45 0
|
5月前
|
存储 C语言
二叉树-堆
二叉树-堆
38 0
|
5月前
|
存储 机器学习/深度学习 算法
二叉树与堆
二叉树与堆
|
存储 算法
【二叉树的顺序结构:堆 && 堆排序 && TopK](一)
【二叉树的顺序结构:堆 && 堆排序 && TopK](一)
66 0
二叉树——链式存储
✅<1>主页:我的代码爱吃辣 📃<2>知识讲解:数据结构——二叉树 🔥<3>创作者:我的代码爱吃辣 ☂️<4>开发环境:Visual Studio 2022 💬<5>前言:上期讲了二叉树的顺序存储,今天来讲一下二叉树的链式存储。
|
存储 程序员
二叉树(堆)
二叉树(堆)
|
存储
【数据结构二叉树的链式存储讲解及前中后序遍历和层次遍历】
二叉树的链式存储结构是指, 用链表来表示一棵二叉树, 即用链来指示元素的逻辑关系。
264 0
|
存储 算法 Java
数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】(三)
数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】
125 0
数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】(三)