樹的深度優先遍歷的非遞迴實現

2021-10-20 19:54:09 字數 1071 閱讀 3065

1.前序遍歷的非遞迴實現

首先根結點入棧,然後執行迴圈條件為(top!=-1)的迴圈,依次出棧棧中元素,每齣棧乙個元素需要判斷其右孩子和左孩子是否存在(先右後左,因為棧是「先進後出」,而前序遍歷是根左右的順序,先訪問的是左子樹,所以就要讓左子樹**棧以便先訪問),如果存在則將其入棧,否則一直出棧直到棧空為止,**如下:

void

preordernonrecursion

(btnode *bt)

if(p->lchild)}}

}

2.後序遍歷的非遞迴實現

後序是左右根的順序,那麼逆後序則是根右左的順序,而前序又是根左右的順序,那麼我們可以得知,如果將前序遍歷中對左右子樹的檢查順序顛倒就可以得到根右左(逆後序)方式的遍歷序列,看到逆我們則想到棧,如果可以以逆後序的遍歷序列依次入棧在出棧則可以得到我們想要的後序遍歷,**如下:

void

postordernonrecursion

(btnode *bt)

if(p->rchild)

}while

(top2!=-1

)//此時從棧頂依次輸出的序列則為後序遍歷序列

}}

3.中序遍歷的非遞迴實現

首先將根結點入棧,然後依次順其左子樹將其左孩子全部入棧,直到遇到某一節點無左孩子時則出棧並輸出乙個元素,然後判斷其是否有右孩子,如果有右孩子則重複1

2.否則繼續出棧乙個元素,直到棧空並且剛出棧的這個元素無右孩子,**如下:

void

inordernonrecursion

(btnode *bt)

if(top!=-1

)}}}

//該演算法的執行流程是:

//1.將根結點先入棧➡️相繼入棧所有左孩子節點,直到某一棵樹無左子樹,則出棧並輸出,然後檢查其

//右子樹,如果存在右子樹則重複1,否則繼續出棧,直到棧空並且無右子樹。

深度優先遍歷演算法的非遞迴實現

深度優先遍歷演算法的非遞迴實現需要了解深度優先遍歷的執行過程,設計乙個棧來模擬遞迴實現中系統設定的工作棧,演算法的偽 描述為 假設圖採用鄰接矩陣作為儲存結構,具體演算法如下 cpp view plain copy print 深度優先遍歷演算法的非遞迴實現需要了解深度優先遍歷的執行過程,設計乙個棧來...

遍歷多叉樹(遞迴 非遞迴廣度優先 深度優先)

簡單的遍歷乙個樹形結構資料的幾種方法 非遞迴方法效率最好。function window,undefined users 遞迴實現 var parsetreejson function treenodes console.log 遞迴實現 parsetreejson treenodes 非遞迴廣度優...

生成迷宮的深度優先遍歷演算法的非遞迴實現

生成一張二維單路徑迷宮圖,可以想到的方法之一就是圖的遍歷。因為單路徑顧名思義就是要求每個節點能切只能訪問一次,這正好和圖的遍歷方法一樣。其次就是圖的遍歷保證了只有一條路徑。執行後即如下圖所示 首先建立乙個二維陣列,char maze h w 其中h和w必須是奇數,建立乙個空間足夠大的棧stack h...