定義:在一棵完全二叉樹中,滿足a[parent[i]] <= a[i]
(小根堆為例)。性質1
:parent[i] = i/2; left[i] = i*2; right[i] = i*2+1;性質2
:高度為
h的堆,元素對多
個,最少
個;性質3:含
n個元素的堆的高度為floor(lg n);性質
4:當用陣列表示儲存了
n個元素的堆時,葉子結點的下標是
floor(n/2)+1……n
操作:
1.heapify(int k)
前提條件是其子結點滿足堆的性質,則操作完成後,以該點給根的樹也滿足堆的性質: 2.
decrease(int k)
當乙個元素的值減小時,應該往上冒泡去找適合自己的位置;增加元素可以理解為乙個點的權值從
+infinite
改到了當前值,所以也可以用這個操作; 3.
extract():int
刪除根結點,並返回權值大小 4.
increase(int k)
增加乙個新的結點
5.build(int size)
陣列狀態下以o(n)的複雜度建堆
基本就這些,把這些**熟記於心後,就要具體問題具體處理了!
二叉堆學習總結
二叉堆是一種特殊的堆,二叉堆是完全二元樹 二叉樹 或者是近似完全二元樹 二叉樹 二叉堆有兩種 最大堆和最小堆。最大堆 父結點的鍵值總是 大於或等於 任何乙個子節點的鍵值。最小堆 父結點的鍵值總是 小於或等於 任何乙個子節點的鍵值。二叉堆用陣列儲存,從下標1開始,並且因為二叉堆為完全二叉樹,所以除根節...
heap的一些實現,二叉堆,左式堆,二項佇列
這裡的堆指的都是二叉堆,為了優先佇列產生 優先佇列,使一些特殊的結點在出隊的時候要優先出來。出隊入隊操作變成了insert和delete 堆是乙個完全二叉樹,除了最後一層,其餘層都是滿的。這樣的話儲存用乙個陣列就可以,任乙個元素位置在i,其左兒子位置是2 i,右兒子位置是2 i 1,父結點是i 2向...
二叉堆的實現
include include define max heap size 101 class binaryminheap void insert intvalue void removemin intgetmin void displayheaparray private int heaparray...