堆(Heap)大根堆 小根堆

2021-10-21 23:50:09 字數 1545 閱讀 7189

具有以下的特點:

1)完全二叉樹;

2)heap中儲存的值是偏序;

min-heap: 父節點的值小於或等於子節點的值;

max-heap: 父節點的值大於或等於子節點的值;

一般都用陣列來表示堆,i結點的父結點下標就為(i–1)/2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。如第0個結點左右子結點下標分別為1和2。

插入乙個元素:新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。

每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個有序的數列,現在的任務是將這個新資料插入到這個有序資料中——這就類似於直接插入排序中將乙個資料併入到有序區間中。

按定義,堆中每次都刪除第0個資料。為了便於重建堆,實際的操作是將最後乙個資料的值賦給根結點,然後再從根結點開始進行一次從上向下的調整。調整時先在左右兒子結點中找最大的,如果父結點比這個最小的子結點還大說明不需要調整了,反之將父結點和它交換後再考慮後面的結點。相當於從根結點將乙個資料的「下沉」過程。

對於葉子節點,不用調整次序,根據滿二叉樹的性質,葉子節點比內部節點的個數多1.所以i=n/2 -1 ,不用從n開始。

堆建好之後堆中第0個資料是堆中最大的資料。取出這個資料再執行下堆的刪除操作。這樣堆中第0個資料又是堆中最大的資料,重複上述步驟直至堆中只有乙個資料時就直接取出這個資料。

堆(Heap)大根堆 小根堆

目錄一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為1和2。插入乙個元素 新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...

資料結構 堆(Heap)大根堆 小根堆

目錄 堆的儲存 一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為1和2。堆的操作 insert 插入乙個元素 新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從...

堆(大根堆 小根堆)

堆又可稱之為完全二叉堆。這是乙個邏輯上基於完全二叉樹 物理上一般基於線性資料結構 如陣列 向量 鍊錶等 的一種資料結構。學習過完全二叉樹的同學們都應該了解,完全二叉樹在物理上可以用線性資料結構進行表示 或者儲存 例如陣列int a 5 就可以用來描述乙個擁有5個結點的完全二叉樹。那麼基於完全二叉樹的...