資料結構之 堆

2021-08-02 08:14:26 字數 1895 閱讀 5852

堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質:

key[i]<=key[2i+1]&&key[i]<=key[2i+2]或者key[i]>=key[2i+1]&&key>=key[2i+2]

即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。堆分為大頂堆和小頂堆,滿足key[i]>=key[2i+1]&&key>=key[2i+2]稱為大頂堆,滿足 key[i]<=key[2i+1]&&key[i]<=key[2i+2]稱為小頂堆。由上述性質可知大頂堆的堆頂的關鍵字肯定是所有關鍵字中最大的,小頂堆的堆頂的關鍵字是所有關鍵字中最小的。

(引自用陣列表示完全二叉樹:乙個完全二叉樹在其倒數第二層以上是滿的,並且其最後一層上的葉子結點是從左到右填滿的。因此,指導最後一片葉子,完全二叉樹中沒有空洞。

如果一顆二叉樹是完全的,使用陣列而不是鍊錶會更好。可以使用層序遍歷將這棵二叉樹的資料存放到乙個陣列中的連續位置。這種表示可以容易地找到乙個結點的雙親或孩子中的資料。如果從陣列的索引1開始存放二叉樹,即跳過陣列的第乙個位置,則陣列索引i處結點的:

雙親在索引i/2處,除非該結點是根節點(i為1);

子結點在索引2i與2i+1處。

避免交換

在陣列索引10處有可用於新元素的空間,這個位置的雙親是位置10/2,即5,因而將新元素85與索引5處的內容30比較,由於85>30,所以將30移動到索引10處。

這時,在陣列索引5處有可用於新元素的空間,這個位置的雙親是位置5/2,即2,則將新元素85與索引2處的內容80比較,由於85>80,所以講80移動到索引5處。

這時,在陣列索引2處有可用於新元素的空間,這個位置的雙親是位置2/2,即1,則將新元素85與索引1處的內容90比較,由於85<90,所以講85插入索引2處。

為了將新元素插入堆,要從下乙個可用於葉子的空閒位置開始。跟蹤從該葉子到根的路徑,直到找到新元素的正確位置。在這樣做的同時,將元素從雙親向子結點移動以便最終為新元素騰出空間。

將半堆轉化為堆

為了刪除堆的根,首先用堆的最後乙個子結點替換根,這一步驟形成乙個半堆,因此要使用方法reheap將半堆轉換為堆。

刪除根演算法

方法1:插入法: 

從空堆開始,依次插入每乙個結點,直到所有的結點全部插入到堆為止。 

方法2:調整法: 

序列對應乙個完全二叉樹;從最後乙個分支結點(n div 2)開始,到根(1)為止,依次對每個分支結點進行調整(下沉),以便形成以每個分支結點為根的堆,當最後對樹根結點進行調整後,整個樹就變成了乙個堆。 

對如圖的序列,要使其成為堆,我們從最後乙個分支結點(10/2),其值為72開始,依次對每個分支節點53,18,36 45進行調整(下沉). 

兩種方法詳細對比參考:

資料結構之堆

原帖 對於堆的資料結構的介紹,在網上搜了下,具體講的不是很多。發現比較好的一篇介紹堆的部落格是在此感謝他。通過對上面那篇部落格的學習,然後自己也去翻了下 演算法導論 裡面關於堆排序 heapsort 的介紹。這樣就對堆有了更加深刻的認識,在此,我結合自己的一點點理解,主要還是基於上面那篇部落格的內容...

資料結構之堆

堆 我們這裡指二叉堆 是一棵完全二叉樹,並且祖先節點的所有子孫節點都不小於 或不大於 祖先節點的值。通常我們把根節點作為第一層的話,那麼深度為h的堆就有2 h 1 2 h 1個節點,顯然擁有n個節點的堆,其高度為lgn。也就是說對堆進行插入語刪除操作我們都需要lgn的時間。由於堆的完全樹的性質,因此...

資料結構之堆

1.概述 堆 也叫優先佇列 是一棵完全二叉樹,它的特點是父節點的值大於 小於 兩個子節點的值 分別稱為大頂堆和小頂堆 它常用於管理演算法執行過程中的資訊,應用場景包括堆排序,優先佇列等。2.堆的基本操作 堆是一棵完全二叉樹,高度為o lg n 其基本操作至多與樹的高度成正比。在介紹堆的基本操作之前,...