簡要說明樹的深度優先、廣度優先遍歷算法,及非遞歸實現的特點

二叉樹的遍歷:

D:訪問根結點,L:遍歷根結點的左子樹,R:遍歷根結點的右子樹。

給定一棵二叉樹的前序遍歷序列和中序遍歷序列可以惟一確定一棵二叉樹。

二叉樹的深度優先遍歷的非遞歸的通用做法是採用棧,廣度優先遍歷的非遞歸的通用做法是採用隊列。

 

深度優先遍歷二叉樹。

1. 中序遍歷(LDR)的遞歸算法:

若二叉樹爲空,則算法結束;否則:

    中序遍歷根結點的左子樹;

    訪問根結點;

    中序遍歷根結點的右子樹。

2. 前序遍歷(DLR)的遞歸算法:

若二叉樹爲空,則算法結束,否則:

    訪問根結點;

    前序遍歷根結點的左子樹;

    前序遍歷根結點的右子樹。

3. 後序遍歷(LRD)的遞歸算法:

若二叉樹爲空,則算法結束,否則:

    後序遍歷根結點的左子樹;

    後序遍歷根結點的右子樹;

    訪問根結點。

 

廣度優先遍歷二叉樹。

廣度優先周遊二叉樹(層序遍歷)是用隊列來實現的,從二叉樹的第一層(根結點)開始,自上至下逐層遍歷;在同一層中,按照從左到右的順序對結點逐一訪問。

按照從根結點至葉結點、從左子樹至右子樹的次序訪問二叉樹的結點。算法:

    1初始化一個隊列,並把根結點入列隊;

    2當隊列爲非空時,循環執行步驟3到步驟5,否則執行6;

    3出隊列取得一個結點,訪問該結點;

    4若該結點的左子樹爲非空,則將該結點的左子樹入隊列;

    5若該結點的右子樹爲非空,則將該結點的右子樹入隊列;

    6結束。

 

非遞歸深度優先遍歷二叉樹。

棧是實現遞歸的最常用的結構,利用一個棧來記下尚待遍歷的結點或子樹,以備以後訪問,可以將遞歸的深度優先遍歷改爲非遞歸的算法。

1. 非遞歸前序遍歷:遇到一個結點,就訪問該結點,並把此結點推入棧中,然後下降去遍歷它的左子樹。遍歷完它的左子樹後,從棧頂托出這個結點,並按照它的右鏈接指示的地址再去遍歷該結點的右子樹結構。

2. 非遞歸中序遍歷:遇到一個結點,就把它推入棧中,並去遍歷它的左子樹。遍歷完左子樹後,從棧頂托出這個結點並訪問之,然後按照它的右鏈接指示的地址再去遍歷該結點的右子樹。

3. 非遞歸後序遍歷:遇到一個結點,把它推入棧中,遍歷它的左子樹。遍歷結束後,還不能馬上訪問處於棧頂的該結點,而是要再按照它的右鏈接結構指示的地址去遍歷該結點的右子樹。遍歷遍右子樹後才能從棧頂托出該結點並訪問之。另外,需要給棧中的每個元素加上一個特徵位,以便當從棧頂托出一個結點時區別是從棧頂元素左邊回來的(則要繼續遍歷右子樹),還是從右邊回來的(該結點的左、右子樹均已周遊)。特徵爲Left表示已進入該結點的左子樹,將從左邊回來;特徵爲Right表示已進入該結點的右子樹,將從右邊回來。

4. 簡潔的非遞歸前序遍歷:遇到一個結點,就訪問該結點,並把此結點的非空右結點推入棧中,然後下降去遍歷它的左子樹。遍歷完左子樹後,從棧頂托出一個結點,並按照它的右鏈接指示的地址再去遍歷該結點的右子樹結構。

----------------------------------------------------------------------

    圖的深度優先搜索法是樹的先根遍歷的推廣,它的基本思想是:從圖G的某個頂點v0出發,訪問v0,然後選擇一個與v0相鄰且沒被訪問過的頂點vi訪問,再從vi出發選擇一個與vi相鄰且未被訪問的頂點vj進行訪問,依次繼續。如果當前被訪問過的頂點的所有鄰接頂點都已被訪問,則退回到已被訪問的頂點序列中最後一個擁有未被訪問的相鄰頂點的頂點w,從w出發按同樣的方法向前遍歷,直到圖中所有頂點都被訪問。
    圖的廣度優先搜索是樹的按層次遍歷的推廣,它的基本思想是:首先訪問初始點vi,並將其標記爲已訪問過,接着訪問vi的所有未被訪問過的鄰接點vi1,vi2, …, vi t,並均標記已訪問過,然後再按照vi1,vi2, …, vi t的次序,訪問每一個頂點的所有未被訪問過的鄰接點,並均標記爲已訪問過,依次類推,直到圖中所有和初始點vi有路徑相通的頂點都被訪問過爲止。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章