二叉樹前序、中序、後序遍歷相互求法

最近參加一些筆試發現,不少公司喜歡考二叉樹前序、中序、後序遍歷相互求法,即若是知道兩個的遍歷,如何求第三種遍歷方法,今天總結來總結一下。有兩種方法:比較笨的方法是畫出來二叉樹,而後根據各類遍歷不一樣的特性來求;也能夠編程求出。下面先對畫樹方法進行說明,以瞭解原理。編程

首先,咱們看看前序、中序、後序遍歷的特性: 
前序遍歷: TLR  (規律:根在前;子樹在根後且左子樹比右子樹靠前);blog

    1.訪問根節點 
    2.前序遍歷左子樹 
    3.前序遍歷右子樹 遞歸


中序遍歷: LTR  (規律:根在中;左子樹在跟左邊,右子樹在根右邊);原理

    1.中序遍歷左子樹 
    2.訪問根節點 
    3.中序遍歷右子樹 二叉樹


後序遍歷:LRT  (規律:根在後;子樹在根前且左子樹比右子樹靠前);遍歷

    1.後序遍歷左子樹 
    2.後序遍歷右子樹 
    3.訪問根節點方法

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

例:im

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

相關文章
相關標籤/搜索