前 中 後序遍歷非遞迴演算法

2021-10-05 19:31:25 字數 1027 閱讀 7414

前中後序的差異在於節點訪問的時序。

前序遍歷的根節點訪問在遍歷左子樹的同時就可以完成,實際上前序遍歷並不僅僅是訪問根節點。同時,它還訪問了結點的左孩子結點,也就是孩子結點是相對於雙親結點來說的,訪問了該節點也就是訪問了其雙親結點的左孩子結點,剩下的工作就是完成右孩子結點的訪問。這時候也是將左節點和根節點以及乙個未知的右子樹結點構成的乙個根左右的前序遍歷。沒有乙個二叉樹會沒有葉子結點,這個時候葉子結點已經被當做根節點處理,結束整個迴圈。

而中序遍歷無法在遍歷左子樹時完成根節點訪問,因為在遍歷左子樹時完成的根節點訪問一定是先根後左,而不是先左後根。所以要先遍歷完左子樹到葉子結點,然後將每乙個棧頂元素作為根節點被訪問(觸發問題2),此時的根節點也是左孩子,同乙個訪問被賦予了兩重含義,順序是先作為根節點訪問再在向上時作為左孩子訪問。

而後序遍歷是在訪問過左右孩子之後再訪問根節點,所以同樣是先一左到底,進行了右子樹遍歷的結點可以出棧並訪問。

【教材原文:在遍歷過程中遇到某結點時並不能立即訪問它,而是將它壓棧,等到其左子樹遍歷完,彈棧訪問之。】

也就是說,當某一結點的左子樹遍歷完,自然是以先左的順序訪問,而此時位於葉子結點,無左右孩子,從而向上訪問其雙親結點。訪問完雙親結點後,遍歷其右子樹(觸發問題3),再次遍歷左子樹,向上訪問雙親,並遍歷右子樹。這個迴圈的過程可以看做左節點和根節點以及乙個未知的右子樹結點構成的乙個左根右的中序遍歷。

左右子樹的訪問始終是先左後右,所以每次右子樹的遍歷都以已經進行過左子樹遍歷的結點為起點,但這個遍歷並不是一遍到底,其中每乙個結點都要進行左子樹遍歷【再次進入一開始的步驟】,直至葉子結點出現,無左右孩子,從而向上訪問其雙親結點。訪問完雙親結點後,遍歷其右子樹。【出現了和上文一樣的步驟】。最關鍵的地方在於,右子樹的遍歷以沒有左子樹的節點的出現為結束條件。也就是說,沒有乙個二叉樹會一直出現有左子樹的結點,最後總會出現乙個葉子結點,沒有左孩子也沒有右孩子,以此終結右子樹的遍歷。

樹的前中後序遍歷(遞迴與非遞迴版)

對於二叉樹而言,我們首先應當知曉的知識就是二叉樹的遍歷。首先,二叉樹遍歷有前中後三種遍歷方法,在遞迴版中,前序遍歷就是第一次遇到該節點就列印,中序遍歷就是第二次遇到列印該節點,後續遍歷就是第三次遇到該節點列印。遞迴實質是系統幫助我們壓棧,儲存現場資訊,而非遞迴就需要我們自己來壓棧。二叉樹結構 pub...

後序遍歷非遞迴演算法的實現

後序遍歷非遞迴演算法的實現 這個是在前面的基礎上,進行後序遍歷非遞迴演算法,這個演算法是很多求二叉樹路徑的基礎,比如求根結點到某點的路徑,或求兩個結點最近的公共祖先等。include include define maxsize 1000 using namespace std typedef st...

非遞迴前,中,後序遍歷二叉樹

相比遞迴遍歷二叉樹,非遞迴遍歷二叉樹稍難一些,而又數非遞迴後序遍歷二叉樹更難。在我通過與這段時間所學資料結構相結合,學習和了解了非遞迴遍歷二叉樹的方法,這裡三種遍歷方式都會用到棧,利用棧的逐層壓棧與先進後出的特點,類似於用 實現了遞迴遍歷二叉樹的基本方法。非遞迴二叉樹的遍歷個人認為注重的是思想,實現...