堆與最大堆

2021-08-07 20:44:47 字數 2894 閱讀 4774

這篇部落格主要敘述最大堆

資料結構中的堆和作業系統的堆有點不太一樣:

作業系統的堆大多用鍊錶的形式,而資料結構中的堆使用的是完全二叉樹.

既然它是乙個完全二叉樹,因此就有一下性質:葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹(來自度娘),也就是說,增加結點時只能從最下層從左到右的增加結點,刪除時也只能從最下層從右到左的刪除.

它有乙個重要的兄弟"最大堆,

我們從以下幾個方面來重點討論一下最大堆: 性質

重要的方法

建構函式

全部**

一.性質

二.重要的方法

這裡我先使用了介面,說明它們的作用

在最大堆的類中,首先要宣告整個堆的全域性變數:

這裡用到了乙個私有的方法 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中,把其中最小的值賦給結...

最小堆與最大堆

最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。最小堆 根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。上圖 通常來說,最小堆用於排序找到一堆資料裡面的最小的。因為最小值一定會上浮到根結點。通常用於優先佇列。定時器...