基礎資料結構 堆

2022-08-20 01:30:15 字數 2119 閱讀 3285

更新完了,但是細節說的還不太夠,以後再說吧( ̄▽ ̄)/

堆的本質是乙個完全二叉樹,除了最下面一層以外,其他的每層(假設第\(n\)層)都有\(2^n\)個結點。節點存的值每層都是遞增或者遞減的。遞增的話就是大頂堆,遞減的話就是小頂堆。那麼對於大頂堆來說,每個節點的兒子節點上的值都要小於等於該節點,否則它就不是乙個堆。堆需要維護所有元素中的最大(小)值,我們可以用堆來實現優先佇列。

堆常用的操作有兩個:新增元素,刪除堆頂元素。不過在此之前我們要先看看對於給定的乙個序列,我們如何建堆。

假定我們下面說的堆都是大頂堆。我們可以很清楚的發現,對於乙個堆的子樹而言,它也必然滿足所有節點的兒子結點都小於等於它。也就是說這個子樹也是乙個堆,那麼我們在建樹的時候考慮率需要考慮每個節點和它兒子結點的大小,如果不滿足父節點最大,就要將左右兒子節點中較大的那個和父節點交換。即保證父節點是最大的,兒子節點哪個小我們並不關心。

這樣考慮的話我們可以從堆的下面網上遍歷,對於葉子結點而言我們不必考慮。然後我們比較每個結點和它兩個(或者乙個)兒子結點。如果兒子結點更大,那麼將其和父節點交換。但是這樣交換的話,兒子結點會換的更小,那麼久無法保證下面的結構也滿足堆了,所以這裡我們還需要繼續向下搜兒子結點的兒子結點,直到葉子結點。這樣才能保證每次從上面換下來的小一點的結點能到它該去的地方。我們將這個操作寫成乙個函式,取名shiftdown()

對於插入和刪除操作我們並不像傳統的序列操作一樣找到目標位置插入或刪除再調整。具體的操作步驟如下

插入:將新的值插入到堆的尾部,也就是完全二叉樹的最後乙個節點的下乙個位置。從該位置開始,從下往上調整,如果子節點的值更小,就將其和父節點交換。直到根節點也就是堆頂為止。這個操作我們取名shiftup()

刪除:這裡的刪除操作指的是彈出堆頂的那個最大值。這樣我們可以用最後乙個節點替換堆頂,然後從堆頂往下更新,因為我們只需要保證父節點的值大於子節點,所以只需要跟它的兒子節點比較即可。這個操作其實就是我們剛剛說的shiftdown().

因為寫成了乙個類,所以就直接在注釋裡寫了

#includeusing namespace std;

templateclass heap

heap(t *a, int num);

~heap()

t top()

void pop();

void push(const t &x);

int size()const

private:

void shiftdown(int start);

void shiftup(int start);

t *heap;

int currentsize;

};templateheap::heap(t *a, int num)

}templatevoid heap::shiftdown(int start)

} //迴圈退出要麼是因為父節點已經最大了,要麼是因為比到葉子結點了

//1.對於前者,我們已經讓更大的子節點覆蓋到了父節點中,那麼heap[i]應該是換上去的較大值,

// 換完了以後這裡應該儲存最開始的父節點的較小值,所以我們需要將其賦值為tmp

//2.對於後者,既然已經到了葉子結點,說明這個葉子結點還比我們當初的父節點的值更大,所以依然同上

heap[i] = tmp;

}templatevoid heap::shiftup(int start)

//否則繼續向上延伸

} //最後調整完了以後將我們開始的值存入目的位置

heap[j] = tmp;

}templatevoid heap::pop()

templatevoid heap::push(const t &x)

int main()

; heapheap(a, 5);

while (heap.size())

heap.push(3);

heap.push(5);

heap.push(1);

heap.push(4);

cout << "在新增3,5,1,4後堆頂元素是:" << heap.top() << endl;

資料結構 堆

最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...

資料結構 堆

資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...

資料結構 堆

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...