动画:一篇文章快速学会数据结构-堆

内容介绍

树结构简介

树结构是计算机中常用的一种数据结构。我们先来看一下生活中的树:

计算机中的树和生活中的树是类似的,只不过是倒着的,树根在上,树叶在下。树上的每个组成元素都是一个节点,树根称为根节点,树枝称为分支节点,树叶称为叶子节点,如下图所示:

二叉树结构简介

二叉树是:每个节点最多只能有两个子节点树。二叉树的子节点分为左节点和右节点,如下图:

满二叉树:如果该二叉树的所有叶子节点都在最后一层,并且节点总数= 2^n -1 , n 为层数,则我们称为满二叉树,如下图:

完全二叉树:如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二
层的叶子节点在右边连续,我们称为完全二叉树,如下图:

我们这里注意理解完全二叉树,因为堆结构是一种特殊的完全二叉树。关于树的结构,我们先简单介绍,以后会专门讲解树结构,我们这里主要是讲堆结构,所以先简单提及一下树结构。

堆结构简介

堆(Heap)是一种特殊的树形数据结构,每个结点都有一个值。常见的堆有二叉堆、斐波那契堆等,通常我们所说的堆的数据结构,是指二叉堆。如下图:

堆满足下列两个性质:

  1. 堆中某个节点的值总是不大于或不小于其父节点的值。
  2. 堆总是一棵完全二叉树。
    根节点最大的堆叫做最大堆大根堆,根节点最小的堆叫做最小堆小根堆,如下图所示:

堆的存储

堆是非线性数据结构,可以使用一维数组来存储,将堆中序号对应的数据放到数组对应的索引中,如下图:

堆的一些概念和规律

概念:

  1. 某节点左边的子节点成为:左孩子。
  2. 某节点右边的子节点成为:右孩子。
  3. 某节点的上一个节点成为:父节点。

规律:假设当前节点的索引为i

  1. 父节点索引 = (i - 1) / 2 (Java中除以2取整数,比如7/2 = 3)
  2. 左孩子索引 = 2 * i + 1
  3. 右孩子索引 = 2 * i + 2

堆的定义性质:

  1. 最大堆节点的值大于左右孩子的值,也就是满足:arr[i] > arr[2*i+1] && arr[i] > arr[2*i+2],如下图:

堆获取最大值

获取最大堆的最大值,其实就是获取堆中最前面一个元素。对于堆这种数据结构通常是将最前面的元素和最后面的元素换位置,最大值就到了最后一个位置,然后从堆中排除这个元素,当最后一个元素交换到最前面时,此时就不满足堆的性质了,我们需要将最前面这个元素通过ShiftDown(下沉)的手段让堆继续满足堆的规则。

堆获取最大值可以分成两个步骤:

  1. 将堆中最前面的最大值和最后一个元素交换位置。
  2. 使用ShiftDown让最前面的元素下沉到合适的位置,依然满足堆的性质。
    动画演示效果如下:

这里面重点注意,ShiftDown可以让堆中的一个元素下沉到合适的位置,并且满足堆的规则。后面我们构建堆就需要使用到ShiftDown操作。

ShiftDown详细图解:

最大堆的最后一个非叶子节点

  1. 我们构建堆时需要从最后一个非叶子节点开始按照规则构建堆,所以我们需要知道最后一个非叶子节点计算公式:(堆的最大索引-1) / 2。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
精心整理史上最全的数据结构flash演示动画,共5个版本,祝大家考研成功! \数据结构flash演示\版本1 \数据结构flash演示\版本2 \数据结构flash演示\版本3 \数据结构flash演示\版本4 \数据结构flash演示\版本5 \数据结构flash演示\版本1\1-4 算法和算法分析 冒泡排序.swf \数据结构flash演示\版本1\10-1-1插入排序.swf \数据结构flash演示\版本1\10-2-2直接插入排序.swf \数据结构flash演示\版本1\10-2-3折半插入排序.swf \数据结构flash演示\版本1\10-2-4-1直接插入排序.swf \数据结构flash演示\版本1\10-2-4表插入排序.swf \数据结构flash演示\版本1\10-2-5希尔排序.swf \数据结构flash演示\版本1\10-3-1起泡排序.swf \数据结构flash演示\版本1\10-3-2起泡排序.swf \数据结构flash演示\版本1\10-3-4快速排序.swf \数据结构flash演示\版本1\10-4-2堆排序大顶堆.swf \数据结构flash演示\版本1\10-4-3堆排序大顶堆.swf \数据结构flash演示\版本1\10-4-4堆排序建立堆.swf \数据结构flash演示\版本1\10-5-2归并排序.swf \数据结构flash演示\版本1\10-6-1多关键字排序.swf \数据结构flash演示\版本1\10-6-2分配收集.swf \数据结构flash演示\版本1\10-6-3分配收集2.swf \数据结构flash演示\版本1\10-6-4计数排序.swf \数据结构flash演示\版本1\2-2-1顺序表的查找.swf \数据结构flash演示\版本1\2-2-2顺序表的插入演示.swf \数据结构flash演示\版本1\2-2-3顺序表的插入算法.swf \数据结构flash演示\版本1\2-2-4顺序表的删除演示.swf \数据结构flash演示\版本1\2-2-5顺序表的删除算法.swf \数据结构flash演示\版本1\2-2-6.swf \数据结构flash演示\版本1\2-2-7.swf \数据结构flash演示\版本1\2-2-8.swf \数据结构flash演示\版本1\2-2-9.swf \数据结构flash演示\版本1\2-3-1.1单链表删除节点.swf \数据结构flash演示\版本1\2-3-1.2单链表插入节点.swf \数据结构flash演示\版本1\2-3-1单链表getElem.swf \数据结构flash演示\版本1\2-3-2单链表头插法.swf \数据结构flash演示\版本1\2-3-3.swf \数据结构flash演示\版本1\2-3-4.swf \数据结构flash演示\版本1\2-3-5带头结点的双向循环链表.swf \数据结构flash演示\版本1\2-3-6双向链表的插入.swf \数据结构flash演示\版本1\2-3-7双向链表的删除.swf \数据结构flash演示\版本1\2-3-8.swf \数据结构flash演示\版本1\2-3-9两个有序链表的连接.swf \数据结构flash演示\版本1\3-2-1栈的应用举例-进制转换.swf \数据结构flash演示\版本1\3-3-10链队列.swf \数据结构flash演示\版本1\3-3-11链队列-入队.swf \数据结构flash演示\版本1\3-3-12-1链队列出队.swf \数据结构flash演示\版本1\3-3-12-2链队列出队-队列空.swf \数据结构flash演示\版本1\3-3-13循环队列.swf \数据结构flash演示\版本1\3-3-1栈的应用举例-走迷宫-有解.swf \数据结构flash演示\版本1\3-3-2栈的应用举例-走迷宫-无解.swf \数据结构flash演示\版本1\3-3-4后缀式.swf \数据结构flash演示\版本1\3-3-5后缀式.swf \数据结构flash演示\版本1\3-3-6后缀式.swf \数据结构flash演示\版本1\3-3-7后缀式.swf \数据结构flash演示\版本1\3-3-9栈的应用举例-汉诺塔.swf \数据结构flash演示\版本1\3-4-1杨辉三角.swf \数据结构flash演示\版本1\3-4-2离散事件模拟.swf \数据结构flash演示\版本1\4-1-1串的定位操作.swf \数据结构flash演示\版本1\4-1-2串的替换.s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值