動畫 什麼是二叉堆?

2022-07-03 19:45:12 字數 1580 閱讀 6983

(動態選擇優先順序最高的任務執行)

堆,又稱為優先佇列。雖然名為優先佇列,但堆並不是佇列。堆和佇列是兩種不同的資料結構,堆是樹態的,佇列是線性的。在佇列中,我們可以向佇列新增元素,取出的時候是按照進入佇列的先後順序取出元素的,先進先出;而在堆中,卻不是按照元素新增的先後順序,而是按照元素的優先順序取出元素。

所以二叉堆是為了找出最大或最小而生的,「大」和「小」並不是傳統意義上的小大,而是優先順序的高低。二叉堆分為最大堆和最小堆,最大堆的頂點可以看作是優先順序最高的也可以看作是優先順序最低的,最小堆也是如此。

二叉堆是一種完全二叉樹,因為完全二叉樹的特性普遍使用陣列結構是非常好用的,所以性注定了二叉堆的儲存形式只能是陣列或者動態陣列(長度可變)。

二叉堆最主要的操作是兩個,siftup上浮和siftdown下沉,來保證二叉堆的性質:

1.父節點的鍵值總是優先於任何乙個子節點的鍵值;

2.左右子樹都是以乙個二叉堆。

用陣列儲存二叉堆,堆的頂點下標可以從0開始也可以從1開始。看上面圖中,以self為參照物,self下標的變數為i:

parent(i) = (i - 1) / 2;

leftchild(i) = 2 * i + 1;

rightchild(i) = leftchild(i) + 1 = 2 * i + 2;

如果是堆頂下標從1開始:

parent(i) = i / 2;

leftchild = 2 * i;

rightchild = 2 * i + 1;

二叉堆的節點新增,是在陣列的最末尾插入新節點的,然後進行自下而上調整子節點和父節點,不滿足二叉堆性質則交換,直到當前子樹滿足二叉堆的性質。如果可以為了減少交換次數的話,可以單向複製,使得新增的節點插入到合適的位置。

取出堆中最大的元素其實是取出根節點,這個下沉的操作很有意思了。它有兩方面的下沉:一方面是將根節點下沉到陣列末尾,然後陣列長度假象性減一下;另一方面是將交換後的根節點和左右子樹的根節點作比較,不滿足堆性質的則交換。

構建二叉堆其實是乙個乙個子樹的下沉操作,將無序的完全二叉樹調整為二叉堆。所以它必須從滿足高度為2的子樹根節點開始,即非葉子節點,然後自底向上對每乙個子樹執行siftdown操作,直到完成二叉堆化。

通俗易懂,什麼是二叉堆?

實現 二叉堆是基於完全二叉樹的基礎上,加以一定的條件約束的一種特殊的二叉樹。根據約束條件的不同,二叉堆又可以分為兩個型別 大頂堆和小頂堆。即任何乙個父節點的值,都 大於等於 它左右孩子節點的值。即任何乙個父節點的值,都 小於等於 它左右孩子節點的值。二叉堆的根節點叫做 堆頂 它是大頂堆裡面的最大值,...

什麼是二叉樹

什麼是二叉樹 包含滿二叉樹和完全二叉樹 通過 樹的儲存結構 一節的學習,我們了解了一些樹儲存結構的基本知識。本節將給大家介紹一類具體的樹結構 二叉樹。簡單地理解,滿足以下兩個條件的樹就是二叉樹 本身是有序樹 樹中包含的各個節點的度不能超過 2,即只能是 0 1 或者 2 例如,圖 1a 就是一棵二叉...

動畫 二叉堆解讀 堆排序,優先佇列

二叉堆 是乙個陣列,近似完全二叉樹,分為 最大堆,除根外,任意父親節點值 兒子節點值 性質 一般用於堆排序 最小堆,除根外,任意父親節點值 兒子節點值 性質 一般用於優先佇列 完全二叉樹只要乙個陣列就可以實現,而不需要鏈,也就是說如果樹有n個結點,存在陣列中的下標位為1 n,很容易模擬結點的上下移動...