/*** 二叉堆* <p>* 本质上是一种完全二叉树,分为最大堆和最小堆* 最大堆: 任何一个父节点的值都大于等于它左右孩子节点的值* 最小堆:任何一个父节点的值,都小于或者等于它左右孩子节点的值* 二叉堆的根节点叫堆顶,最大堆的堆顶是整个堆中的最大元素,最小堆的堆顶是整个堆中的最小元素* <p>* <p>* 常规操作:* 1.插入操作* 2.删除节点* 3.构建二叉堆* <p>* 以上操作都依赖于堆的调整:* 上浮和下沉* <p>* 插入节点的时候,插在完全二叉树的最后一个节点上,然后进行上浮调整* 如果是最大堆,那么如果这个新插入的节点比其父节点大,那么就和父节点交换位置,依次类推,最终最多可以上浮到根节点位置* 如果是最小堆,那么如果这个新插入的节点比其父节点小,那么就和父节点交换位置,依次类推,最终最多可以上浮到根节点位置* <p>* <p>* 删除节点的时候,删除根节点,然后将最后一个节点作为根节点,然后进行下沉调整* 如果是最小堆,那么将新的根节点和其左右子树进行比较,如果根节点 大于两个子孩子节点中的最小值节点,和其交换位置 ,依次类推,最终最多可以下沉到叶子节点位置* 如果是最大堆,需要保证堆顶值最大,那么 新的根节点小于两个孩子中的最大值节点,那么和其交换位置,依次类推,最多可以下沉到叶子节点位置* <p>* <p>* 构建二叉堆,依次对所有非叶子节点进行下沉  最终就可以把一个无序的完全二叉树调整为二叉堆* <p>* <p>* 注意!二叉堆是一个完全二叉树,存储方式是顺序存储,存储在数组中,完全二叉树存储在数组中,不会有空位置* <p>* 可以根据数组的下标来计算 假设父节点的下标是parent ,那么它的左孩子的下标就是2xparent+1  右孩子就是2xparent+2* 注意!链表存储的则不能这样算*/
public class Heap {/*** 先序遍历** @param array*/public static void pre(int[] array, int root) {if (root >= array.length) {return;}System.out.print(array[root]);pre(array, 2 * root + 1);pre(array, 2 * root + 2);}/*** 注意! 数组里面 存的时候 顺序和先序遍历什么的不一样 ,要按照左孩子的下标就是2xparent+1  右孩子就是2xparent+2 这样存* 如果没有的,空都要空开,以符合这个条件方便查找*链表的话则是用先序遍历的形式去存,且没有的节点用null表示* @param args*/public static void main(String[] args) {int[] array = new int[]{7, 1, 3, 10, 5,2,8,9,6};pre(array, 0);System.out.println("前序遍历");buildHeadp(array);pre(array, 0);System.out.println("构建成二叉堆,最小堆");int[] array2 = new int[]{1, 3, 2, 6, 5,7,8,9,10};pre(array2, 0);System.out.println("前序遍历");upAdjust(array2);pre(array2, 0);System.out.println("调整成二叉堆,最小堆");}/*** 上浮调整*/public static void upAdjust(int[] array) {//从最后一个节点开始int childIndex = array.length - 1;//这个节点的父节点  不管这个节点是左节点还是右节点 其(坐标-1)/2都是它父节点的下标int parentIndex = (childIndex - 1) / 2;//temp 保存插入的叶子节点的值 用于最后的赋值int temp = array[childIndex];//该值小于父节点的值 且子节点不是根节点while (childIndex > 0 && temp < array[parentIndex]) {//无须真正交换 单向赋值即可array[childIndex] = array[parentIndex];childIndex = parentIndex;parentIndex = (childIndex - 1) / 2;}array[childIndex] = temp;}/*** 下沉节点** @param array       待调整的堆* @param parentIndex 要下沉的父节点* @param length      堆的有效大小*/public static void downAdjust(int[] array, int parentIndex, int length) {//temp保存父节点的值,用于最后的赋值int temp = array[parentIndex];int childIndex = 2 * parentIndex + 1;while (childIndex < length) {//如果有右孩子,且右孩子小于左孩子的值,则定位到右孩子 否则就是左孩子  childIndex++if (childIndex + 1 < length && array[childIndex + 1] < array[childIndex]) {childIndex++;}//如果父节点小于任何一个孩子的值 则直接跳出if (temp<=array[childIndex])break;array[parentIndex]=array[childIndex];parentIndex=childIndex;childIndex=2*childIndex+1;}array[parentIndex]=temp;}/*** 构建堆** @param array 等待调整的堆*/public static void buildHeadp(int[] array) {//从最后一个非叶子节点开始 依次左下沉操作for (int i = (array.length-2)/2; i >=0 ; i--) {downAdjust(array,i,array.length);}}}

二叉堆的原理和构建、调整相关推荐

  1. 优先队列-二叉堆-堆排序原理-Java相关API

    完全二叉树概念 除了最后一层,前面所有层都是满的 最后一层是从左到右 是一个二叉树 堆 满足完全二叉树 父节点存储的元素比子节点大 上浮 不符合堆规则的节点,与父节点交换 直到上浮到符合为止 下沉 不 ...

  2. 构建二叉堆时间复杂度的证明

    http://blog.csdn.net/linuxtiger/article/details/7172258 如果仅从代码上直观观察,会得出构造二叉堆的时间复杂度为O(n㏒n)的结果,这个结果是错的 ...

  3. 排序算法之——优先队列经典实现(基于二叉堆)

    许多应用都需要处理有序的元素,但有时,我们不要求所有元素都有序,或是一定要一次就将它们排序,许多情况下,我们会收集这些元素里的最大值或最小值. 这种情况下一个合适的数据结构应该支持两种操作:插入元素. ...

  4. 漫画:什么是二叉堆?(修正版)

    转载自  漫画:什么是二叉堆?(修正版) 什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 1.最大堆 2.最小堆 什么是最大堆呢?最大堆任何一个父节点的值,都大于等于它左右孩子节点的值 ...

  5. 利用二叉堆实现最小优先队列

    利用二叉堆实现最小优先队列 package 第二章数据结构基础;import java.util.Arrays;public class 二叉堆和优先队列 {public static void ma ...

  6. 二叉堆与二叉堆的构建

    什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆:任何一个父节点的值,都大于或等于它左.右孩子节点的值. 最小堆:任何一个父节点的值,都小于或等于它左.右孩子节点的值. 二叉堆的 ...

  7. 二叉堆的节点插入、删除以及构建过程

    目录 什么是二叉堆 二叉堆的基本操作 1.插入节点 2.删除节点 3.构建二叉堆 代码实现 什么是二叉堆 定义:二叉堆,本质上是一种完全二叉树. 分类:二叉堆分为最大堆和最小堆两种类型,最大堆和最小堆 ...

  8. 【数据结构与算法拓展】二叉堆原理、实现与例题(C和java)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  9. 二叉堆 - 原理与实现

    1. 概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Jav ...

最新文章

  1. 别上当!这些都是5G假项目!
  2. 使用Electron制作一个快速搜索应用(入门向)
  3. HTTP 1.1与HTTP 1.0的比较
  4. 原 BinaryWriter和BinaryReader(二进制文件的读写)
  5. v380怎么设置云存储_计算机网络云计算技术在应用中的不足及缺陷
  6. 计算机主机一闪一闪的无法启动,电脑启动不了灯一闪一闪的
  7. 1.GitLab 安装使用
  8. cmd跑绿色代码_cmd整人代码(cmd简单游戏代码)
  9. PTA 哈利·波特的考试(Floyd计算最短距离并输出路径)
  10. STM32 BOR/POR/PDR介绍
  11. 西安财经大学“荣耀杯”迷你马拉松——微博营销方案
  12. 租户管理门户登录报错,提示身份验证失败
  13. 哈佛结构与冯诺依曼结构(含STM32系统结构解析)
  14. Android 相机开发
  15. 偏最小二乘回归(三):身体特征与体能训练结果的 案例分析
  16. iOS Instruments工具使用
  17. 格局大小决定你的人生高度---the height of your life depends on the size of your life pattern.
  18. uni-app KeyChain(钥匙串),保存的信息不会因App被删除而丢失(ios)
  19. 使用Sharding-Proxy完成mysql分库分表和主从复制
  20. 暴力破解和验证码安全

热门文章

  1. linux浏览器无法下载,红芯浏览器目前已经无法正常下载到
  2. C++学习记录 实验1 CMatrix类设计与实现
  3. 检索COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,错误: 80080005
  4. #Paper Reading# The YouTube Video Recommendation System
  5. Html5 JumpStart学习笔记3:Advanced Layout and Animation
  6. 智象运维 | 如何利用snmp trap监控交换机端口状态(Up/Down)
  7. S7-1200 PLC 电源需求与计算
  8. 暑期LeetCode打卡
  9. Mac版几何画板正式上线
  10. windows下编译libzip库