關於樹的前序遍歷,中序遍歷,後序遍歷的相互轉化(含代碼實現)

首先咱們須要瞭解的是前序遍歷、中序遍歷、後序遍歷的概念。spa

前序遍歷:遞歸

1.首先訪問根節點二叉樹

2.而後遍歷左子樹遍歷

3.最後遍歷右子樹im

中序遍歷:筆試

1.首先遍歷左子樹img

2.而後遍歷根節點筆試題

3.最後遍歷右子樹

後序遍歷:

1.首先遍歷左子樹

2.而後遍歷後子樹

3.最後遍歷根節點

怎麼樣,如今是否是很清晰明瞭了,若是仍是以爲難以記住的話,我認爲能夠這樣理解:根據根節點的遍歷順序來判斷,若是它是一個被遍歷的話,就是前序遍歷(先序遍歷),若是在中間的話,就是中序遍歷,在最後的話,就是後續遍歷咯。

下面討論下三種遍歷方式的相互轉化,這個通常的公司筆試題都會有至少一個選擇。

1.已知前序、中序遍歷,求後序遍歷

例子:前序遍歷: 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

2.已知中序、後序遍歷,求前序遍歷

依然是上面的條件,此次已知中序遍歷:  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

3.已知前序、後序遍歷,求中序遍歷

第一步,根據前序遍歷特色,咱們能夠知道根節點爲G。

第二步,根據後序遍歷的特色,咱們能夠知道根節點的右孩子爲M。

第三步,在前序遍歷中,樹的根節點的左孩子是位於根節點以後的,因此左子樹的根節點爲D。

第四步,觀察後序遍歷AEFDHZMG。能夠得知AEF爲左節點D的子樹。 HZ爲右節點M的子樹。

第五步,一樣地咱們能夠發現遞歸,不過在該種狀況下的樹的狀況不止一個。

最後咱們能夠求得中序遍歷爲:ADEFGHMZ。

本文中例子的樹的結構圖以下:

下面咱們將用代碼進行實現。

相關文章
相關標籤/搜索