算法設計與分析個人總結(2020最新版)

更多學習資源,請關注本人個人微信公衆號:

個人公衆號:

我的微信號:                                      

一、貪婪算法

 

二、二分搜索算法

 

 

 

 

 

三、動態規劃算法

3.1 DP0

 

 

 

3.2 DP1

 

 

3.3 DP2

 

 

 

3.4 DP3

 

 

四、深度優先搜索DFS

4.1 DFS0

 

 

 

 

4.2 DFS1

 

 

五、插入排序算法

 

 

 

六、回溯算法

 

 

 

 

 

七、遞歸算法

  •  

     

 

 

八、樹

 

 

九、拓撲排序算法

 

十、快速排序算法

 

十一、歸併排序算法

 

 

 

 

十二、冒泡排序算法

 

十三、高級數據結構

 

十四、樹狀數組

 

十五、線段樹

 

十六前綴樹

 

十七、優先隊列

 

十八、樹的遍歷

18.1 前序遍歷

 

對於當前節點,先輸出該節點,然後輸出他的左孩子,最後輸出他的右孩子。以上圖爲例,遞歸的過程如下:

(1):輸出 1,接着左孩子;

(2):輸出 2,接着左孩子;

(3):輸出 4,左孩子爲空,再接着右孩子;

(4):輸出 6,左孩子爲空,再接着右孩子;

(5):輸出 7,左右孩子都爲空,此時 2 的左子樹全部輸出,2 的右子樹爲空,此時 1 的左子樹全部輸出,接着 1 的右子樹;

(6):輸出 3,接着左孩子;

(7):輸出 5,左右孩子爲空,此時 3 的左子樹全部輸出,3 的右子樹爲空,至此 1 的右子樹全部輸出,結束。

18.2 中序遍歷

對於當前結點,先輸出它的左孩子,然後輸出該結點,最後輸出它的右孩子。以上圖爲例:

(1):1-->2-->4,4 的左孩子爲空,輸出 4,接着右孩子;

(2):6 的左孩子爲空,輸出 6,接着右孩子;

(3):7 的左孩子爲空,輸出 7,右孩子也爲空,此時 2 的左子樹全部輸出,輸出 2,2 的右孩子爲空,此時 1 的左子樹全部輸出,輸出 1,接着 1 的右孩子;

(4):3-->5,5 左孩子爲空,輸出 5,右孩子也爲空,此時 3 的左子樹全部輸出,而 3 的右孩子爲空,至此 1 的右子樹全部輸出,結束。

 

18.3 後序遍歷

對於當前結點,先輸出它的左孩子,然後輸出它的右孩子,最後輸出該結點。依舊以上圖爲例:

(1):1->2->4->6->7,7 無左孩子,也無右孩子,輸出 7,此時 6 無左孩子,而 6 的右子樹也全部輸出,輸出 6,此時 4 無左子樹,而 4 的右子樹全部輸出,輸出 4,此時 2 的左子樹全部輸出,且 2 無右子樹,輸出 2,此時 1 的左子樹全部輸出,接着轉向右子樹;

(2):3->5,5 無左孩子,也無右孩子,輸出 5,此時 3 的左子樹全部輸出,且 3 無右孩子,輸出 3,此時 1 的右子樹全部輸出,輸出 1,結束。

18.4 根據前序遍歷中序遍歷推導樹的結構

已知:

前序遍歷: GDAFEMHZ

中序遍歷: ADEFGHMZ

求後序遍歷

首先,要先畫出這棵二叉樹,怎麼畫呢?根據上面說的我們一步一步來……

1.先看前序遍歷,前序遍歷第一個一定是根節點,那麼我們可以知道,這棵樹的根節點是G,接着,我們看中序遍歷中,根節點一定是在中間訪問的,那麼既然知道了G是根節點,則在中序遍歷中找到G的位置,G的左邊一定就是這棵樹的左子樹,G的右邊就是這棵樹的右子樹了。

2.我們根據第一步的分析,大致應該知道左子樹節點有:ADEF,右子樹的節點有:HMZ。同時,這個也分別是左子樹和右子樹的中序遍歷的序列。

3.在前序遍歷遍歷完根節點後,接着執行前序遍歷左子樹,注意,是前序遍歷,什麼意思?就是把左子樹當成一棵獨立的樹,執行前序遍歷,同樣先訪問左子樹的根,由此可以得到,左子樹的根是D,第2步我們已經知道左子樹是ADEF了,那麼在這一步得到左子樹的根是D,請看第4步。

4.從第2步得到的中序遍歷的節點序列中,找到D,發現D左邊只有一個A,說明D的左子樹只有一個葉子節點,D的右邊呢?我們可以得到D的右子樹有EF,再看前序遍歷的序列,發現F在前,也就是說,F是先前序遍歷訪問的,則得到E是F的左子樹,只有一個葉子節點。

5.到這裏,我們可以得到這棵樹的根節點和左子樹的結構了。如下圖:

6.接着看右子樹,在第2步的右子樹中序遍歷序列中,右子樹是HMZ三個節點,那麼先看前序遍歷的序列,先出現的是M,那麼M就是右子樹的根節點,剛好,HZ在M的左右,分別是它的左子樹和右子樹,因此,右子樹的結構就出來了:

7.到這裏,我們可以得到整棵樹的結構:

18.5 根據樹的中序遍歷後序遍歷推導樹的結構

中序遍歷:ADEFGHMZ

後序遍歷:AEFDHZMG

1..根據後序遍歷的特點(左右中),根節點在結尾,確定G是根節點。根據中序遍歷的特點(左中右),確定ADEF組成左子樹,HMZ組成右子樹。

2.分析左子樹。ADEF這四個元素在後序遍歷(左右中)中的順序是AEFD,在中序遍歷(左中右)中的順序是ADEF。根據後序遍歷(左右中)的特點確定D是左子樹的節點,根據中序遍歷(左中右)的特點發現A在D前面,所以A是左子樹的左葉子,EF則是左子樹的右分枝。

EF在後序(左右中)和中序(左中右)的相對位置是一樣的,所以EF關係是左右或者左中,排除左右關係(缺乏節點),所以EF關係是左中。

到此得出左子樹的形狀

3.分析右子樹。HMZ這三個元素在中序遍歷(左中右)的順序是HMZ,在後序遍歷(左右中)的順序是HZM。根據後序遍歷(左右中)的特點,M在尾部,即M是右子樹的節點。再根據中序遍歷(左中右)的特點,確定H(M的前面)是右子樹的左葉子,Z(M的後面)是右子樹的右葉子。

所以右子樹的形狀

  1. 最後得出整棵樹的形狀

 

十九、雙端隊列

 

 

 

二十、鏈表合併

 

二十一、鏈表

 

 

二十二、數組字符串

 

二十三、樹的子結構

 

二十四、進制轉換

十進制轉二進制,我們採用短除法,比如要將十進制的29轉成二進制,用29除以2,商寫在下面,餘數寫在商的右邊

繼續往下除,同樣的商寫在下面,餘數寫在商的右邊

當除到商爲0的時候,就不用往下除了

這個時候將餘數從下到商排列出來,得到的數就是二進制的

二進制轉十進制採用權相加法,比如1011010轉成十進制,需要說明下,2的幾次方哪個次數是怎麼確定的,比如從左數的第一位1,在它的前面還有六位,那麼它的次數就是爲6

十進制數怎麼轉換成16進制的數

直接除16,反向取餘。如52轉換成16進制。52/16=3……4,餘數爲4;接着3/16=0……3。所以轉換的結果爲34H。在比如把60536轉換成16進制。60536/16=3783……8,3783/16=236……7,236/16=14……12,12對應16進制的C,14/16=0……14,14對應16進制的E,所以最終轉換結果爲EC78

十六進制轉十進制:

16進制數的第0位的權值爲16的0次方,第1位的權值爲16的1次方,第2位的權值爲16的2次方……

所以,在第N(N從0開始)位上,如果是是數 X (X 大於等於0,並且X小於等於 15,即:F)表示的大小爲 X * 16的N次方。

例:2AF5換算成10進制:

用豎式計算:

第0位: 5 * 16^0 = 5

第1位: F * 16^1 = 240

第2位: A * 16^2= 2560

第3位: 2 * 16^3 = 8192

直接計算就是:

5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997

 

由於在二進制的表示方法中,每四位所表示的數的最大值對應16進制的15,即16進制每一位上最大值,所以,我們可以得出簡便的轉換方法,將16進制上每一位分別對應二進制上四位進行轉換,即得所求:

例:2AF5換算成2進制:

第0位: (5)16 = (0101) 2

第1位: (F)16 = (1111) 2

第2位: (A) 16 = (1010) 2

第3位: (2) 16 = (0010) 2

得:(2AF5)16=(0010.1010.1111.0101)2

 

 

 

 

更多學習資源,請關注本人個人微信公衆號:

個人公衆號:

我的微信號:                                      

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章