1. 程式人生 > >Ted 帶你學習資料結構 之 二叉堆(Binary Heap)

Ted 帶你學習資料結構 之 二叉堆(Binary Heap)

二叉堆(Binary Heap)

(1)structure property

Heap(堆)是一個除了底層節點外的完全填滿的二叉樹,底層可以不完全,左到右填充節點。(a heap is a binary tree that completely filled, with the exception of bottom level, which is filled from left to right.)這樣的樹叫做完全二叉樹。

完全二叉堆的通俗解釋為: 上層節點全滿時,下層才能有節點;且下層節點必須是從左往右新增的。

一個高度為h 的完全二叉樹應該有以下的性質:

a) 有2^h到2^h-1個節點

b) 完全二叉樹的高度為[logN](向下取整)

此時注意,當N為2的多次方時,h=logN+1;

c)他的左子節點在2*i,右子節點在(2*i+1)

d) 它的父節點在【i/2】(向下取整)

二叉堆是一種邏輯上的資料結構,而它是由陣列來實現的。

下圖顯示了完全二叉樹與陣列的對應關係:

在這裡插入圖片描述

在這裡插入圖片描述

(2)heap order property

有兩種結構:最大堆和最小堆。 最大堆:父結點的鍵值總是大於或等於任何一個子節點的鍵值;最小堆:父結點的鍵值總是小於或等於任何一個子節點的鍵值。示意圖如下:

圖3

java裡面,大家熟知的Queue介面中的PriorityQueue,它就是最小堆最好的例子。

其實從這裡可以看出,堆的兩條性質:(a)完全二叉樹;(b)父節點小於後繼子節點

(3)堆的操作

  • 插入

如果要在二叉堆中插入或刪除一個元素,必須保證堆性質仍能滿足。

新插入的節點new 放在完全二叉樹最後的位置,再和父節點比較。如果new節點比父節點小,那麼交換兩者。交換之後,繼續和新的父節點比較…… 直到new節點不比父節點小,或者new節點成為根節點。這樣得到的樹,就恢復了堆的性質。

4

圖 5

  • 刪除

刪除操作一定是踢出陣列的第一個元素(即根節點),這麼來第一個元素以前的位置就成了空位,讓最後一個節點 last成為新的節點,從而構成一個新的二叉樹。再將last節點不斷的和子節點比較。如果last節點比兩個子節點中小的那一個大,則和該子節點交換。直到last節點不大於任一子節點都小,或者last節點成為葉節點。

圖 6

圖 7

End!

本篇內容基本上轉自以下不同博文節選部分。 感恩這些博主,提供很多思路去理解二叉堆。

二叉堆

在這裡插入圖片描述