数据结构

您所在的位置:网站首页 java树结构实现 数据结构

数据结构

2024-01-25 00:24| 来源: 网络整理| 查看: 265

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。

详细介绍了堆(Heap)这种数据结构的特点和原理,并且提供了Java代码的完全实现,包括大顶堆、小顶堆的构建,堆节点的添加、删除,大顶堆、小顶堆的排序等方法!

1 堆的概述 1.1 堆的概述

要想了解堆,就必须了解二叉树的一些基本性质,如果不是很了解二叉树的,可以看看这篇文章:二叉树的入门以及Java实现案例详解。

这里所说的堆(Heap)是数据结构中的堆,而不是内存模型中的堆。堆是一种树形结构,它满足如下性质:

堆是一棵完全二叉树,也被称为二叉堆(binary heap),一般说的堆就是指二叉堆,实际上还有左倾堆、右倾堆等,它们不要求是完全二叉树。 堆中任意节点的值总是不大于/不小于其子节点的值。

如果每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆/最大堆/大根堆,如下图左;或者每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆/最小堆/小根堆,如下图右。 在这里插入图片描述

1.2 堆的常见应用和实现

堆的应用:

堆常被用于实现“优先队列”(PriorityQueue)。优先队列可以自由添加数据,但取出数据时要从最小值开始按顺序取出; 堆还用于实现堆排序。

堆的实现:由于堆作为一颗完全二叉树,因此根据二叉树的性质,完全二叉树能够完美的映射到数组结构中去:如果节点从0开始编号,并把节点映射到数组中之后,则节点之间满足如下关系:

大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2](049,此时将父节点的值移动到子节点位置处,heap[8] = heap[3],此时数组结构为{97, 76, 49, 49, 65, 13, 27, 38, 49},然后将start的索引值变成父节点的索引值,即start=3,重新计算parent=1。

由于此时start>0开始第二次内层循环,判断父节点和子节点的大小,由于78>76,此时将父节点的值移动到子节点位置处,heap[3] = heap[1],此时数组结构为{97, 76, 49, 76, 65, 13, 27, 38, 49},然后将start的索引值变成父节点的索引值,即start=1,重新计算parent=0。

由于此时start>0开始第三次内层循环,判断父节点和子节点的大小,由于78



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3