二叉樹的中序遍歷順序是左子節點->根節點->右子節點。二叉樹如下圖所示:
1 過程
我們選用棧來存放需要處理的二叉樹節點,出棧順序即二叉樹的遍歷順序。首先要進行棧的初始化,很顯而易見的,如果二叉樹的根節點為空,那麼不需要任意遍歷直接結束;如果二叉樹的根節點不為空,使用current指向當前要處理的元素,此時current代表根節點1,如下圖所示:
入棧規則:首先我們需要獲取棧頂元素current,注意該地方獲取指拿到棧頂元素,並不是將棧頂元素出棧,檢測棧頂是否有左孩子,如果有那麼需要一直將左孩子入棧,直到棧頂的元素不再有左孩子為止,如下圖所示:
出棧規則:此時需要彈出棧頂元素,即將棧頂元素輸出,然後檢測該元素是否有右孩子,如果有右孩子則current指向其右孩子,按入棧規則進行處理。如果沒有右孩子則繼續彈出棧頂。
如上圖所示,此時current代表節點4,4沒有左孩子,打破入棧規則,則將其彈出,4無右孩子則繼續彈出棧頂2,發現其含有右孩子,按入棧規則入棧5,8也需要入棧,如下圖所示:
8無左孩子,打破入棧規則,將其彈出,發現8沒有右孩子,繼續彈出5,5沒有右孩子,繼續彈出1,1有右孩子,按入棧規則,將3入棧,3有左孩子6,繼續入棧6,如下圖所示:
6無左孩子,打破入棧規則,將其彈出,6並無右孩子,繼續彈出3,此時輸出為4->2->8->5->1->6->3
3有右孩子7,將3入棧,按入棧規則檢測3無左孩子,打破入棧規則;此時棧內只有元素7;
將棧頂7彈出,7有右孩子9,打破入棧規則,將9入棧;此時輸出為4->2->8->5->1->6->3->7;棧內有元素9;
將9彈出,9無右孩子,並且此時棧為空,則遍歷結束,輸出為4->2->8->5->1->6->3->7->9。
2 思考
根據棧的使用規則,要區分獲取棧頂元素與彈出棧頂元素的操作不同點,思考如何將遍歷的順序與棧數據結構特點的結合使用。
3 代碼
此處給出二叉樹中序非遞歸遍歷的Java樣例代碼:
4 總結
本文總結了二叉樹中序非遞歸遍歷的算法,其中使用了棧做輔助數據結構,並詳細的繪圖並描述了遍歷過程,對於使用的輔助數據結構棧的操作與中序遍歷的特點進行結合達到效果,最後給出了實現代碼。