二叉樹的深度優先遍歷 廣度優先遍歷和非遞迴遍歷

2022-05-21 07:34:24 字數 1390 閱讀 4821

二叉樹的遍歷:

d:訪問根結點,l:遍歷根結點的左子樹,r:遍歷根結點的右子樹。

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

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

深度優先遍歷二叉樹。

1. 中序遍歷(ldr)的遞迴演算法:

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

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

訪問根結點;

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

2. 前序遍歷(dlr)的遞迴演算法:

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

訪問根結點;

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

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

3. 後序遍歷(lrd)的遞迴演算法:

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

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

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

訪問根結點。

廣度優先遍歷二叉樹。

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

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

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

2當隊列為非空時,迴圈執行步驟3到步驟5,否則執行6;

3出佇列取得乙個結點,訪問該結點;

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

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

6結束。

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

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

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

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

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

二叉樹的深度優先遍歷和廣度優先遍歷

深度優先搜尋演算法 depth first search 是搜尋演算法的一種。是沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源...

二叉樹的深度優先遍歷與廣度優先遍歷

深度優先搜尋演算法 depth first search 是搜尋演算法的一種。是沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源...

二叉樹的深度優先遍歷和廣度優先遍歷

深度優先搜尋演算法 depth first search 是搜尋演算法的一種。是沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源...