一、先序遍歷:
1.根節點進棧
2.節點出棧,並訪問,若有右孩子,右孩子進棧,若有左孩子,左孩子進棧
3.重複2直至棧空
--------------01
------02-------------09
--03-----06-----10-----13
04-05-07-08-11-12-14-15
* definition for binary tree
* struct treenode
class solution
return result;
}};
二、中序遍歷:
1.節點進棧,若有左孩子則將指標指向左孩子,重複進行,直到最左
2.節點退棧,並訪問。若有右孩子,則將指標指向右孩子
3.重複1 2直至棧空且樹空
--------------08
------04-------------12
--02-----06-----10-----14
01-03-05-07-09-11-13-15
class solution elseelse}}
return result;
}};
三、後序遍歷:
1.節點進棧,若有左孩子則將指標指向左孩子,重複進行,直到最左
2.取棧頂節點(不出棧),若無右孩子或右孩子已經訪問,則節點出棧並訪問,並作訪問標記。若有右孩子且右孩子未被訪問,則將指標指向右孩子
3.重複1 2直至棧空且樹空
--------------15
------07-------------14
--03-----06-----10-----13
01-02-04-05-08-09-11-12
class solution elseelse}}
return result;
}};
四、層次遍歷:
1.根節點入隊
2.隊首節點出隊並訪問,若有左孩子,則左孩子入隊,若有右孩子,則右孩子入隊
3.重複2直至隊空
class solution
}return result;
}};
總結:
中序遍歷和後序遍歷有著相似的**結構,在訪問節點的時候,左子樹都已經訪問完了。中序遍歷是直接訪問節點,再轉向右子樹。後序遍歷是先要判斷是右子樹是否存在訪問過,如果存在且未訪問過,須先訪問右子樹,待右子樹訪問完畢後再訪問根節點。
後序遍歷非遞迴是先訪問左子樹、再右子樹、最後根。可以用棧來儲存節點,必須分清返回根節點時,是從左子樹返回的,還是從右子樹返回的,所以,使用輔助指標pre,指向最近訪問過的節點。也可以在節點中增加乙個標誌域,記錄是否已經被訪問
後序遍歷非遞迴法可以用來求根節點到某節點的路徑、公共祖先等。
因為訪問某個節點p的時候,棧中節點恰好是p節點的所以祖先,從棧底到棧頂再加上p節點,剛好構成根節點到p節點的一條路徑。
如求pq公共祖先的思路:後序找到p後q,儲存此時的棧中元素。在繼續找到另乙個,用此時的棧中元素和先前元素中的棧去比對。
二叉樹的非遞迴前序中序後序遍歷
做個筆記,方便日後查閱 全部是模板函式,c 語言 template void preorder node root,ostream os if st.empty os endl template void midorder node root,ostream os if st.empty os en...
二叉樹的前序 中序 後序遍歷(非遞迴)
今天弄了一天的二叉樹的前序 中序和後序遍歷,分享出來,共同交流。中採用先序遍歷的方法建立二叉樹,示例建立二叉樹格式如下 建立過程中,以 include include typedef struct btnodebtnode,btree typedef struct stackbtstack type...
二叉樹的前序 中序 後序遍歷(非遞迴)
如需遞迴寫法,可以參考 結構體定義 struct node 構建二叉樹使用二叉鍊錶使用非遞迴的寫法,必然需要其他輔助空間來實現,對於遞迴改寫成非遞迴的乙個做法而言,我們首選的輔助空間就是棧結構。而我們要做的,就是使用棧去模擬遞迴的操作 只能操作棧頂 如果想使用棧完全模擬遞迴的操作,將會對結構體進行更...