3-14(堆的完結以及二叉樹的遍歷)

今天主要完成了堆的實現、排序以及堆的增刪操做。而且學習了二叉樹的遍歷,以及完成了二叉樹的一道算法題。
一、堆
首先堆是一個二叉樹;另外堆分爲大堆和小堆,大堆是每一個根都不小於其子樹,小堆是每一個根都不大大於其子樹,也就是說大堆的root爲最大值,同理,小堆的root爲最小值;
再者,堆排序能夠將一個數組進行降序或升序排序,降序使用小堆,升序使用大堆,由於創建一個小堆,其根節點爲最小值,這樣把根節點和最後一個節點對換,就獲得了最小值,再利用向下排序,找出第二個小的值。同理,大堆具備最大值爲root,對換後,最大值就出來了,因此適合升序。
另外 堆最大特色是適合用來招數。
如topK問題:
找出n個數裏面的前k的最大值。
方案1:利用建個n個數的大堆,每次將最大值與最後一個元素對換,再利用向下調整,找出最大的k個數。時間複雜度爲0(n+(k-1)*logn),由於建堆的時間複雜度爲0(n),每次向下調整的時間複雜度爲0(logn)。可是此方案的空間複雜度過高,不推薦使用。
方案2:減少堆,創建k個元素的小堆,將剩下的數依次與root比較,若是比root大,就替換root,而後向下調整,再將堆裏面的最小值送到root上面,這樣比較完成後,其堆裏面都是k個大值。這個方案最好,推薦使用。算法

二、二叉樹
二叉樹的遍歷有前序遍歷,中序遍歷,後序遍歷,層次遍歷。 這裏面須要注意的是左,右都是表示左子樹,右子樹,
而不是單純的左右。數組

相關文章
相關標籤/搜索