首先咱們須要瞭解的是前序遍歷、中序遍歷、後序遍歷的概念。spa
前序遍歷:遞歸
1.首先訪問根節點二叉樹
2.而後遍歷左子樹遍歷
3.最後遍歷右子樹im
中序遍歷:筆試
1.首先遍歷左子樹img
2.而後遍歷根節點筆試題
3.最後遍歷右子樹
後序遍歷:
1.首先遍歷左子樹
2.而後遍歷後子樹
3.最後遍歷根節點
怎麼樣,如今是否是很清晰明瞭了,若是仍是以爲難以記住的話,我認爲能夠這樣理解:根據根節點的遍歷順序來判斷,若是它是一個被遍歷的話,就是前序遍歷(先序遍歷),若是在中間的話,就是中序遍歷,在最後的話,就是後續遍歷咯。
下面討論下三種遍歷方式的相互轉化,這個通常的公司筆試題都會有至少一個選擇。
例子:前序遍歷: GDAFEMHZ 中序遍歷:ADEFGHMZ
咱們能夠根據已知的遍歷順序將樹畫出來,而後求得後序遍歷。
第一步,根據前序遍歷的特色,咱們知道根結點爲G
第二步,觀察中序遍歷ADEFGHMZ。其中root節點G左側的ADEF必然是root的左子樹,G右側的HMZ必然是root的右子樹。
第三步,觀察左子樹ADEF,左子樹的中的根節點必然是大樹的root的leftchild。在前序遍歷中,大樹的root的leftchild位於root以後,因此左子樹的根節點爲D。
第四步,一樣的道理,root的右子樹節點HMZ中的根節點也能夠經過前序遍歷求得。在前序遍歷中,必定是先把root和root的全部左子樹節點遍歷完以後纔會遍歷右子樹,而且遍歷的左子樹的第一個節點就是左子樹的根節點。同理,遍歷的右子樹的第一個節點就是右子樹的根節點。
第五步,觀察發現,上面的過程是遞歸的。先找到當前樹的根節點,而後劃分爲左子樹,右子樹,而後進入左子樹重複上面的過程,而後進入右子樹重複上面的過程。最後就能夠還原一棵樹了。該步遞歸的過程能夠簡潔表達以下:
1 肯定根,肯定左子樹,肯定右子樹。
2 在左子樹中遞歸。
3 在右子樹中遞歸。
4 打印當前根。
能夠畫出相應的二叉樹結構(文尾已畫出),求得後序遍歷的順序爲:AEFDHZMG
依然是上面的條件,此次已知中序遍歷: ADEFGHMZ 後序遍歷: AEFDHZMG
步驟:
第一步,根據後序遍歷的特色,咱們知道後序遍歷最後一個結點即爲根結點,即根結點爲G。
第二步,觀察中序遍歷ADEFGHMZ。其中root節點G左側的ADEF必然是root的左子樹,G右側的HMZ必然是root的右子樹。
第三步,觀察左子樹ADEF,左子樹的中的根節點必然是大樹的root的leftchild。在前序遍歷中,大樹的root的leftchild位於root以後,因此左子樹的根節點爲D。
第四步,一樣的道理,root的右子樹節點HMZ中的根節點也能夠經過前序遍歷求得。在先後序遍歷中,必定是先把root和root的全部左子樹節點遍歷完以後纔會遍歷右子樹,而且遍歷的左子樹的第一個節點就是左子樹的根節點。同理,遍歷的右子樹的第一個節點就是右子樹的根節點。
第五步,觀察發現,上面的過程是遞歸的。先找到當前樹的根節點,而後劃分爲左子樹,右子樹,而後進入左子樹重複上面的過程,而後進入右子樹重複上面的過程。最後就能夠還原一棵樹了。該步遞歸的過程能夠簡潔表達以下:
1 肯定根,肯定左子樹,肯定右子樹。
2 在左子樹中遞歸。
3 在右子樹中遞歸。
4 打印當前根。
這樣,咱們就能夠畫出二叉樹的形狀,如上圖所示,這裏就再也不贅述。
那麼,前序遍歷: GDAFEMHZ
第一步,根據前序遍歷特色,咱們能夠知道根節點爲G。
第二步,根據後序遍歷的特色,咱們能夠知道根節點的右孩子爲M。
第三步,在前序遍歷中,樹的根節點的左孩子是位於根節點以後的,因此左子樹的根節點爲D。
第四步,觀察後序遍歷AEFDHZMG。能夠得知AEF爲左節點D的子樹。 HZ爲右節點M的子樹。
第五步,一樣地咱們能夠發現遞歸,不過在該種狀況下的樹的狀況不止一個。
最後咱們能夠求得中序遍歷爲:ADEFGHMZ。
本文中例子的樹的結構圖以下:
下面咱們將用代碼進行實現。