二叉堆堆的定義

堆的定義

堆(heap),這裏所說的堆是數據結構中的堆,而不是內存模型中的堆。堆通常是一個可以被看做一棵樹,它滿足下列性質:
[性質一] 堆總是一棵完全樹;
[性質二] 堆中任意節點的值總是不大於(不小於)其子節點的值。

將任意節點不大於其子節點的堆叫做最小堆或小根堆,而將任意節點不小於其子節點的堆叫做最大堆或大根堆。常見的堆有二叉堆、左傾堆、斜堆、二項堆、斐波那契堆等等。

二叉堆的定義

二叉堆是完全二元樹或者是近似完全二元樹,它分爲兩種:最大堆和最小堆。
最大堆:父結點的鍵值總是大於或等於任何一個子節點的鍵值;最小堆:父結點的鍵值總是小於或等於任何一個子節點的鍵值。示意圖如下:

二叉堆一般都通過"數組"來實現。數組實現的二叉堆,父節點和子節點的位置存在一定的關係。有時候,我們將"二叉堆的第一個元素"放在數組索引0的位置,有時候放在1的位置。當然,它們的本質一樣(都是二叉堆),只是實現上稍微有一丁點區別。
假設"第一個元素"在數組中的索引爲 0 的話,則父節點和子節點的位置關係如下:
(01) 索引爲i的左孩子的索引是 (2*i+1);
(02) 索引爲i的左孩子的索引是 (2*i+2);
(03) 索引爲i的父結點的索引是 floor((i-1)/2);

假設"第一個元素"在數組中的索引爲 1 的話,則父節點和子節點的位置關係如下:
(01) 索引爲i的左孩子的索引是 (2*i);
(02) 索引爲i的左孩子的索引是 (2*i+1);
(03) 索引爲i的父結點的索引是 floor(i/2);

注意:本文二叉堆的實現統統都是採用"二叉堆第一個元素在數組索引爲0"的方式!

二叉堆的圖文解析

1. 添加

假設在最大堆[90,80,70,60,40,30,20,10,50]種添加85,需要執行的步驟如下:

2. 刪除

假設從最大堆[90,85,70,60,80,30,20,10,50,40]中刪除90,需要執行的步驟如下:

注意:考慮從最大堆[90,85,70,60,80,30,20,10,50,40]中刪除60,執行的步驟不能單純的用它的子節點來替換;而必須考慮到"替換後的樹仍然要是最大堆"!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章