這篇部落格主要敘述最大堆
資料結構中的堆和作業系統的堆有點不太一樣:
作業系統的堆大多用鍊錶的形式,而資料結構中的堆使用的是完全二叉樹.
既然它是乙個完全二叉樹,因此就有一下性質:葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹(來自度娘),也就是說,增加結點時只能從最下層從左到右的增加結點,刪除時也只能從最下層從右到左的刪除.
它有乙個重要的兄弟"最大堆,
我們從以下幾個方面來重點討論一下最大堆: 性質
重要的方法
建構函式
全部**
一.性質
二.重要的方法
這裡我先使用了介面,說明它們的作用
在最大堆的類中,首先要宣告整個堆的全域性變數:
這裡用到了乙個私有的方法 shiftup ,目的是在插入資料後,使得整個堆仍舊滿足最大堆的性質
這裡用到了私有方法 shiftdown,同樣是為了讓它刪除資料後整個堆保持最大堆
三.建構函式
它有兩個建構函式,乙個是建立乙個限定空間的空堆,另乙個是通過陣列建立乙個堆
四.全部**
package com.heap;
/** * 最大堆:
* >這裡使用 data 陣列來儲存最大堆,data[0]不使用,data[1]表示根節點,data[2]表示根節點左子樹中的根節點,依次類推
* 性質:
* >最大堆滿足完全二叉樹的性質
* >父節點的值大於兩個子節點
* 如果使用陣列下標 1 儲存第乙個元素
* >下標為 k 的節點的父節點為 k / 2;
* >下標為 k 的節點的左孩子為 2 * k;
* >下標為 k 的節點的右孩子為 2 * k + 1;
* 如果使用陣列下標 0 儲存第乙個元素
* >下標為 k 的節點的父節點為 (k - 1) / 2;
* >下標為 k 的節點的左孩子為 2 * k + 1;
* >下標為 k 的節點的右孩子為 2 * k + 2;
*/public class maxheap implements imaxheap
}//刪除節點時使用,注意 k 表示下標
private void shiftdown(int k)
//如果 data[k] 比即將交換位置的值(子樹中的最大值)要大,證明現在已經是最大堆了,退出迴圈
if (data[k] >= data[j])
//交換 data[k] 與 data[j]
int temp = data[k];
data[k] = data[j];
data[j] = temp;
//更新 k 的位置,在進行新一輪的交換,直到整個結構滿足最大堆的性質
k = j;}}
public int getcount()
public boolean isempty()
//插入新的元素
public void insert(int item)
//刪除最大的節點,即刪除 data[1],然後使整個二叉樹仍然保持最大堆的性質
public int extrackmax()
public int sortinside()
return data;
}public maxheap(int num)
public maxheap(int arr)
count = num;
//從第乙個擁有子節點的節點( arr[count / 2] )開始進行shiftdown操作,逐漸往上遍歷
for (int i = count / 2; i >= 1; i--) }}
二叉堆 最大堆實現
include include include include include include using namespace std template typename item class maxheap void shiftdown int k public 建構函式,構造乙個空堆,可容納ca...
最小堆與最大堆
wang 程式設計日記三 最小堆最小堆的實質是把樹儲存在乙個陣列,在陣列中,非葉結點的左子樹在陣列中的下標 設為x 該結點在陣列中的下標 2 1 那麼x 1就是該結點的右子樹.相反的如果某結點在陣列中的下標為x,那麼其父結點為 x 1 2。在乙個單個的結點a和其左右子樹b.c中,把其中最小的值賦給結...
最小堆與最大堆
最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。最小堆 根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。上圖 通常來說,最小堆用於排序找到一堆資料裡面的最小的。因為最小值一定會上浮到根結點。通常用於優先佇列。定時器...