优先队列是一种非常常见的数据结构,
而最大最小树又是其中最具代表性的一种优先队列。
在此详细的讲述一下最大树的插入、删除、初始化等基本操作的思路。
在文章最后附上一段Demo源码提供测试,使用C++语言实现了最大堆。
首先先介绍一下最大树的概念。
最大树是每个节点的值都要大于或等于其子节点的值的树。
而最大堆就是最大的完全二叉树。
因为最大堆是完全二叉树,所以拥有n个元素的堆的高度为[log2(n+1)]。
因此如果可以在O(height)的时间内完成插入和删除操作,则其复杂度为O(log2n)。
下面是一个最大堆的图例。这里的第一层和第二层是标记第几层子节点,并不是树的第几层。
1.最大堆的插入:
先来举个栗子说明最大堆的插入问题。
这是一个有五个元素的最大堆。
如果要插入一个元素,那么插入完成后的结构应该是这样才能保证依旧是完全二叉树:
如果插入的元素是1,那很简单,直接作为第二层的元素2的左孩子节点插入即可。
但是如果插入的元素是5,也就是比该插入位置的父节点大的话,就需要做一定的调整了。
应该把元素2下移为左孩子,同时在判断5能否占据元素2的位置。
因为5<20,所以5可以插入在当前位置。插入完成:
但是如果想要插入的元素是25呢?
那么在这一步便会有所不同:
因为25>20,不满足我们最大堆的要求,所以我们要做的事情和上次一样,
先将20移下一层:
再将25插入即可。插入完成: