前言
哈哈,继之前俩篇“回怼”文章,又整出一篇来自堆排序的文章。文章不是我原创,参杂了一些互联网搜集的内容(侵删),以及自己的理解。
之前俩篇文章,分别如下:
面试被问到Spring IOC、AOP和动态代理,用这篇文章怼过去
面试被问到Java虚拟机,用这篇文章怼过去
正文
何为堆?
首先堆是一种树,一种特殊的树。只要满足下面两个条件,它就是一个堆:
(1)一颗完全二叉树;
(2)某个节点的值总是不大于(或不小于)其父节点的值。
根节点最大的堆叫做大顶堆,根节点最小的堆叫做小顶堆。
几种堆
1、满二叉树
满二叉树是指所有层都达到最大节点数的二叉树。比如:
2、完全二叉树
完全二叉树是指除了最后一层其它层都达到最大节点数,且最后一层节点都靠左排列。比如,下面这颗树:
可见,满二叉树是一种特殊的完全二叉树。
那么,使用什么结构存储完全二叉树最节省空间呢?
我们可以看见,完全二叉树的节点都是比较紧凑的,且只有最后一层是不满的,所以使用数组是最节省空间的,比如上面这颗完全二叉树我们可以这样存储。