二叉樹(shù)的前中后序遍歷-遞歸&非遞歸實(shí)現(xiàn)

二叉樹(shù)的遍歷口訣

前序:根左右

中序:左根右

后序:左右根


遞歸解法:

前序遍歷:


前序遍歷

中序遍歷:


中序遍歷

后序遍歷:


后續(xù)遍歷

遞歸解法很簡(jiǎn)單,對(duì)應(yīng)“根左右”,“左根右”,“左右根”,三個(gè)口訣,遞歸的代碼的位置不同。


非遞歸解法,內(nèi)在的原理和遞歸解法是相同的,只不過(guò)通過(guò)while循環(huán)來(lái)代替了遞歸。

前序遍歷:

實(shí)現(xiàn)思路:

對(duì)于任一節(jié)點(diǎn)P,(理解了就很容易背下來(lái))

1)輸出節(jié)點(diǎn)P,然后將其入棧,再看P的左孩子是否為空;

2)若P的左孩子不為空,則置P的左孩子為當(dāng)前節(jié)點(diǎn),重復(fù)1)的操作;

3)若P的左孩子為空,則將棧頂節(jié)點(diǎn)出棧,但不輸出,并將出棧節(jié)點(diǎn)的右孩子置為當(dāng)前節(jié)點(diǎn),看其是否為空;

4)若不為空,則循環(huán)至1)操作;

5)如果為空,則繼續(xù)出棧,但不輸出,同時(shí)將出棧節(jié)點(diǎn)的右孩子置為當(dāng)前節(jié)點(diǎn),看其是否為空,重復(fù)4)和5)操作;

6)直到當(dāng)前節(jié)點(diǎn)P為NULL并且??眨闅v結(jié)束。


前序非遞歸


中序遍歷:

對(duì)于任一節(jié)點(diǎn)P,

1)若P的左孩子不為空,則將P入棧并將P的左孩子置為當(dāng)前節(jié)點(diǎn),然后再對(duì)當(dāng)前節(jié)點(diǎn)進(jìn)行相同的處理;

2)若P的左孩子為空,則輸出P節(jié)點(diǎn),而后將P的右孩子置為當(dāng)前節(jié)點(diǎn),看其是否為空;

3)若不為空,則重復(fù)1)和2)的操作;

4)若為空,則執(zhí)行出棧操作,輸出棧頂節(jié)點(diǎn),并將出棧的節(jié)點(diǎn)的右孩子置為當(dāng)前節(jié)點(diǎn),看起是否為空,重復(fù)3)和4)的操作;

5)直到當(dāng)前節(jié)點(diǎn)P為NULL并且棧為空,則遍歷結(jié)束。


中序非遞歸


后續(xù)遍歷:

對(duì)于任一節(jié)點(diǎn)P,維護(hù)連個(gè)棧,第一個(gè)的作用同上,第二個(gè)的作用用來(lái)標(biāo)識(shí)某個(gè)節(jié)點(diǎn)的左右子樹(shù)是否全部遍歷完成。

1)先將節(jié)點(diǎn)P入棧stack1;stack2同時(shí)入棧0。

2)否含有左子節(jié)點(diǎn),如果有則繼續(xù)執(zhí)行1)操作。

3)如果沒(méi)有,檢查stack1是否為空并且stack2棧頂為1。

4)如果3)不滿足,則獲取stack1的值,不出棧,并且設(shè)置當(dāng)前node為stack1棧頂值,同時(shí)stack2棧頂出棧,同時(shí)push 1進(jìn)來(lái),代表該節(jié)點(diǎn)左右均遍歷完。


后續(xù)非遞歸實(shí)現(xiàn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容