Binary Heap是一种特殊的二叉树结构,它满足以下两个条件:
父节点的值总是小于或者大于子节点的值,对于小于子节点的情况我们称之为最小堆,对于大于子节点的情况我们称之为最大堆。
它是一棵完全二叉树,也就是除了最后一层,其他层上的节点都是满的,最后一层上的节点都靠左排列。
Binary Heap是一种非常有用的数据结构,通常被用来实现优先队列等高效的算法。
以下是一个最小堆的例子:
4
/ \
9 7
/ \ / \
10 15 12 20
在这个二叉树中,根节点的值为4,它小于它的所有子节点的值。此外,这个二叉树也满足完全二叉树的条件,因为除了最后一层,其他层上的节点都是满的,最后一层上的节点也是靠左排列。
当我们把这个二叉树表示成一个数组时,它的结构如下:
index: 0 1 2 3 4 5 6
value: 4 9 7 10 15 12 20
在上述表示中,根据完全二叉树的性质,我们可以用下标来表示一个节点的位置,例如节点4的下标为0,节点9的下标为1,等等。这个数组实际上是一个满足最小堆的性质的数组,我们可以利用这个数组来实现堆排序等高效的算法。
答案:
答案會根據編程語言不同而不同,實現方式可以參考Visualgo網站的二叉堆實現代碼
答案:
可以用兩個二叉堆,一個大根堆,一個小根堆來實現。大根堆存放前半部分數據,小根堆存放後半部分數據。當數據總數為奇數時,中位數就是大根堆的堆頂;當數據總數為偶數時,中位數就是兩個堆的堆頂的平均值。
答案:
可以使用小根堆來實現。先把前K個數建成大小為K的小根堆,然後對於剩餘的數,如果比堆頂的數要大,就把堆頂的數刪除,然後把該數插入堆中。最終堆中剩餘的就是前K大的數。
答案:
可以使用遞歸的方式實現。若二叉堆為空,返回0;否則返回左子樹和右子樹高度的較大值加1。
答案:
首先將無序數組構建成完全二叉樹,然後從最後一個非葉子節點開始,從右到左,逐個進行下沉操作,將每個節點下沉到合適的位置,直到根節點下沉到滿足堆的性質為止。