1. 程式人生 > >資料結構之二叉樹的前序遍歷、中序遍歷、後序遍歷、層序遍歷

資料結構之二叉樹的前序遍歷、中序遍歷、後序遍歷、層序遍歷

最近也是在準備筆試,由於沒有系統的學過資料結構,所以每次在考到二叉樹的遍歷的時候都是直接跪,次數多了也就怒了,前些天也是準備論文沒時間整這些,現在提交了,算是稍微輕鬆點了,所以花了半天的時間來學了下二叉樹。現在記下來,以便後序查閱。

一、二叉樹的遍歷概念

    1.  二叉樹的遍歷是指從根結點觸發,按照某種次序依次訪問二叉樹中所有結點,使得每個結點被訪問一次且僅被訪問一次。

(1). 前(先)序遍歷

前序遍歷:若二叉樹為空,則空操作返回,否則先訪問根結點,然後前序遍歷左子樹,再前序遍歷右子書。

特點:①. 根----->左------->右

           ②. 根據前序遍歷的結果可知第一個訪問的必定是root結點。

(2). 中序遍歷

中序遍歷:若二叉樹為空,則空操作返回,否則從根結點開始(注意並不是先訪問根結點),中序遍歷根結點的左子樹,然後訪問根結點,最後中序遍歷右子樹。

特點:①. 左----->根------->右

           ②. 根據中序遍歷的結果,再結合前序遍歷的root結點去劃分root結點的左右子樹。

(3). 後序遍歷

後序遍歷:若二叉樹為空,則空操作返回,否則從左到右先葉子結點後結點的方式遍歷訪問左右子樹,最後訪問根結點。

特點:①. 左------>右------>根

           ②. 根據後序遍歷的結果可知最後訪問的必定是root結點。

(4). 層序遍歷

層序遍歷:若二叉樹為空,則空返回,否則從樹的第一層,即根結點開始訪問,從上而下逐層遍歷,在同一層中,按從左到右的順序對結點逐個訪問。

特點:①. 從左到右,從上到下

           ②. 可知第一個訪問的必定是root結點

      2. 例子。

假如有如下的二叉樹:

根據上面的定義,得出如下的遍歷結果

前序遍歷:ABDHIEJCFKG

中序遍歷:HDIBEJAFKCG

後序遍歷:HIDJEBKFGCA

層序遍歷:ABCDEFGHIJK

      我個人根據二叉樹圖來求遍歷結果的經驗是:先根據定義,給出所有子樹的相對位置,然後再整理。

二、根據遍歷結果去推其他的遍歷結果

相信這種情況下,考題的最多,一是考查如何遞迴倒推;二是節約試卷版面,畫圖也麻煩。

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

關於二叉樹,多練習幾次就熟悉了。