二叉樹(shù)的遍歷口訣
前序:根左右
中序:左根右
后序:左右根
遞歸解法:
前序遍歷:
中序遍歷:
后序遍歷:
遞歸解法很簡(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并且棧空,遍歷結(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)左右均遍歷完。