中序遍歷(非遞迴)

2021-07-22 20:30:25 字數 903 閱讀 6591

//前序遍歷

/*前序遍歷的遞迴實現*/

void preorder(bintree *root)

}/*非遞迴實現*/

/*根據前序遍歷訪問的順序,優先訪問根節點,然後再分別訪問左孩子和右孩子。

即對於任一節點,其可看做是根節點,因此可以直接訪問,訪問完之後,若其左孩子

不為空,按相同規則訪問它的左子樹,當訪問其左子樹時,在訪問它的右子樹

*///對於任意節點p:(1)訪問節點p,並將節點p入棧

//(2)判斷節點p的左孩子是否為空,若為空,則取棧頂節點並進行出棧操作,並將棧頂節點的右孩子置為當前的節點p,迴圈至1;若不為空,則將p的左孩子置為當前的節點p

//(3)直到p為null並且棧為空,則遍歷結束

void preorder(bintree *root)

if(!s.empty()) }}

/*中序遍歷*/

//中序遍歷 「左孩子--根節點--右孩子」

//遞迴實現

void inorder(bintree *root)

}//非遞迴實現

//根據中序遍歷的順序,對於任意節點,優先訪問其左孩子,而左孩子節點又可以看做一根節點,然後繼續訪問左孩子節點為空的節點才進行

//訪問,然後按相同的規則訪問其右子樹。因此其處理過程如下:

//(1)對於任意節點其左孩子不為空,則將p入棧並將p的左孩子置為當前的p,然後對當前節點p再進行相同的處理

//(2)若其左孩子不為空,則取棧頂元素並進行出棧操作,訪問該棧頂節點,然後將當前的p置為棧頂節點的右孩子

//(3)直到p為null並且棧為空則遍歷結束

void inorder(bintree *root)

if(!s.empty())

}}

樹中序遍歷 非遞迴

步驟1 結點的所有路徑情況 如果結點有左子樹,該結點入棧 如果結點沒有左子樹,訪問該結點 如果結點有右子樹,重複步驟1 如果結點沒有右子樹 結點訪問完畢 回退,讓棧頂元素出棧,訪問棧頂元素,並訪問右子樹,重複步驟1 如果棧為空,表示遍歷結束。include iostream include stac...

非遞迴實現先序遍歷和中序遍歷

先序建立二叉樹,表示空結點。使用棧,實現非遞迴先序遍歷和中序遍歷。使用佇列實現層次遍歷。直接上 寒假完善注釋,甚至從頭到尾把 資料結構與演算法 的相關 寫一遍。include include include include using namespace std typedef char datat...

非遞迴中序遍歷

非遞迴中序遍歷 中序遍歷的順序為 左 中 右,通過棧這個資料結構來記錄遍歷的歷史,思想如下 1.找到左子樹的底部葉子節點,列印葉子節點 期間將所有經過的節點壓棧,用於回退到父節點用 2.回退到葉子節點的父節點,列印父節點 在1走到左葉子節點的過程中,通過棧記錄下父節點 3.從父節點進入右兒子,再重複...