**
1.樹是n個節點的有限集,有且僅有乙個特定的稱為根節點。當n=0時,成為空樹。當n>1時,其餘節點可分為m(m>0)個互不相交的有限集,每乙個集合本身又是乙個樹,並稱為根的子樹。
2.二叉樹是樹的一種特殊形式,每乙個節點最多有兩個孩子節點。注意,這裡是最多有2個,也可能只有1個,或者沒有孩子節點。二叉樹包含完全二叉樹和滿二叉樹兩種特殊形式。
3.根據遍歷節點之間的關係,可以分為前序遍歷、中序遍歷、後序遍歷、層序遍歷這4種方式;從更巨集觀的角度劃分,可以劃分為深度優先遍歷和廣度優先遍歷兩大類。
4.二叉堆是一種特殊的滿二叉樹,本質上是一種完全二叉樹,分為最大堆和最小堆。
在最大堆中,任何乙個父節點的值,都大於或等於它左、右孩子節點的值。
在最小堆中,任何乙個父節點的值,都小於或等於它左、右孩子節點的值。
5.優先佇列分為最大優先佇列和最小優先佇列
在最大優先佇列中,無論入隊順序如何,當前最大的元素都會優先出隊,這是基於最大堆實現的。
在最小優先佇列中,無論入隊順序如何,當前最小的元素都會優先出隊,這是基於最小堆實現的。
3.1.1樹
樹和圖是典型的非線性資料結構
樹的最大層級數,被成為樹的高度或深度。
3.1.2二叉樹
1、插入節點:插入位置是完全二叉樹的最後乙個位置。按照最小堆的性質,讓新節點「上浮」,和父節點交換位置,繼續比較,直至到堆頂位置。
2、刪除節點:所刪除的是處於堆頂的節點。把堆的最後乙個節點臨時補到原本堆頂的位置。
然後和它的左、右孩子進行比較。如果左、右孩子節點中的最小的乙個比它小,則「下沉」,依次類推,繼續比較。
3、構建二叉堆:也就是把乙個無序的完全二叉樹調整為二叉堆,本質就是讓所有非葉子節點依次「下沉」。
總結:堆的插入操作是單一節點的「上浮」,刪除操作是單一節點的「下沉」。這兩個操作的平均交換此時都是堆高度的一半,所以時間複雜度是o(logn)。堆的構建,需要所有非葉子節點依次「下沉」,所以時間複雜度是o(nlogn)?但實際上它是o(n)。涉及數學推導過程。
3.3.3**實現:二叉堆的儲存方式是順序儲存,即陣列。
**中有乙個優化的點,就是在父節點和孩子節點做連續交換時,並不一定要真的交換,只需要先把交換一方的值存入temp變數,做單向覆蓋,迴圈結束後,再把temp的值存入交換後的最終位置即可。
小結:二叉堆是實現堆排序及優先佇列的基礎。
3.4優先佇列
3.4.1優先佇列的實現
程式設計師小灰 演算法集錦 漫畫演算法
漫畫 什麼是concurrenthashmap?漫畫 高併發下的hashmap 漫畫 什麼是hashmap?漫畫 什麼是紅黑樹?什麼是aes演算法?整合版 漫畫 什麼是sha系列演算法?漫畫 什麼是md5演算法?漫畫 如何破解md5演算法?漫畫 什麼是base64演算法?什麼是a 尋路演算法?漫畫 ...
程式設計師小灰的漫畫演算法和知識總結,高品質強推!!!
漫畫知識彙總 漫畫 深度優先遍歷 和 廣度優先遍歷 漫畫 什麼是 圖 修訂版 漫畫 什麼是 https 協議?漫畫 什麼是concurrenthashmap?漫畫 高併發下的hashmap 漫畫 什麼是hashmap?漫畫 什麼是紅黑樹?漫畫 什麼是加密演算法?什麼是aes演算法?整合版 漫畫 什麼...
漫畫演算法筆記 堆排序
include include include include include using namespace std 下沉調整 template typename t void downadjust vector vec,int parentindex,int size 如果父節點小於任何乙個孩子...