最大堆、最小堆操做-刪除、

 堆的定義是:n個元素的序列{k1,k2,…,kn},當且僅當知足以下關係時被成爲堆 html

    (1)Ki <= k2i 且 ki <= k2i-1         數組

  或 (2) Ki >= k2i 且 ki >= k2i-1  spa

          (i = 1,2,…[n/2]) htm

當知足(1)時,爲最小堆,當知足(2)時,爲最大堆。 blog

 

  若將此序列對應的一維數組堪稱是一個徹底二叉樹,則2i和2i+1個節點分別是節點i的左右子節點。 get

以下爲一個最大堆: 二叉樹

 

下面以最小堆爲例說明堆的輸出im

 

  圖1爲一個最小堆,當最小節點根節點13輸出後,將最後一個節點97做爲根節點,移到頂端,如圖2. 而後要對堆進行調整。比較此徹底樹的根節點與其兩個子節點大小,由於27 < 38 < 97,因此27是三個節點裏最小的,將節點27與根節點97交換。此時以97替代27而產生的右子樹爲一個新的堆,再以97爲根節點,對此最小堆進行調整,同理,知道要將97與49交換,獲得圖3的徹底樹。此時以97代替49爲根節點的右子樹爲一個新堆,再對此堆作一樣的操做,由於此徹底樹已是最小堆,因此能夠中止操做,堆的調整完畢。此時再將根節點,對的最小值輸出,並進行一樣的調整,能夠獲得如圖4的新堆。這個過程被稱爲「篩選」。 img

 

一樣以最小堆說明堆的初始化di

  從一個無序序列初始化爲一個堆的過程就是一個反覆「篩選」的過程。由徹底二叉樹的性質能夠知,一個有n個節點的徹底二叉樹的最後一個非葉節點是節點[n/2],堆的初始化過程就從這個[n/2]節點開始。上圖爲以下無序數組的初始化:

    {49,38,65,97,76,13,27,50}

  首先,未處理的數組對應的堆爲圖1模樣。從第四個節點開始([8/2]=4),由於50 < 97,故要交換兩節點,交換後還要繼續對其新的左子樹進行相似輸出後那樣的篩選。易見其左子樹只有節點97,已經爲最佳狀況,故能夠繼續堆的初始化,如圖2。再考慮第三個節點,由於13 < 27 < 65,即節點13爲當前的最小節點,故與節點65交換,並對新的左子樹進行篩選,其也爲最佳狀況,故可繼續堆的初始化,結果如圖3。而後考慮第二個節點,由於38 < 50 < 76,故已經爲最優狀況,不用調整。最後再考慮第一個節點,根節點。由於 13 < 38 < 49,故須要將根節點49與其右孩子節點13交換,交換後還要繼續對其新的右子樹進行相似輸出後那樣的篩選,可見右子樹還須要調整,由於 27 < 49 < 65,故將節點49與節點27交換。此時已經處理完了根節點,初始化結束。最終結果如圖5.

相關文章
相關標籤/搜索