定義:在一棵完全二叉樹中,滿足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)的複雜度建堆
基本就這些,把這些代碼熟記於心後,就要具體問題具體處理了!