更多學習資源,請關注本人個人微信公衆號:
個人公衆號:
我的微信號:
一、貪婪算法
、
二、二分搜索算法
三、動態規劃算法
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的後面)是右子樹的右葉子。
所以右子樹的形狀
- 最後得出整棵樹的形狀
十九、雙端隊列
二十、鏈表合併
二十一、鏈表
二十二、數組字符串
二十三、樹的子結構
二十四、進制轉換
十進制轉二進制,我們採用短除法,比如要將十進制的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
更多學習資源,請關注本人個人微信公衆號:
個人公衆號:
我的微信號: