主要是迭代實(shí)現(xiàn)
深度優(yōu)先使用棧,廣度優(yōu)先使用隊(duì)列
使用棧绽淘,主要是為了暫存之后會用的父節(jié)點(diǎn)企量。每個(gè)節(jié)點(diǎn)都可以作為父節(jié)點(diǎn)测萎。
前序遍歷比較簡單,中序遍歷和后序遍歷思路比較接近届巩。
對于前序遍歷硅瞧,父節(jié)點(diǎn)首先(直接)訪問,而且用過就不會再用了姆泻。之后先存右零酪,再存左。然后取左拇勃,重復(fù)四苇。父節(jié)點(diǎn)不需要被回溯
對于中序遍歷,父節(jié)點(diǎn)在訪問過左子樹后訪問方咆,即訪問前要先保證左子樹為空或者訪問過月腋,所以是先保存,后訪問瓣赂,訪問完再保存右子樹榆骚,然后訪問右子樹。
對于后序遍歷煌集,父節(jié)點(diǎn)最后訪問妓肢,保存完父節(jié)點(diǎn),先保存左子樹苫纤,訪問碉钠,之后通過父節(jié)點(diǎn)保存右子樹纲缓,訪問,之后再訪問父節(jié)點(diǎn)喊废。也就是父節(jié)點(diǎn)會多路過一次祝高。父節(jié)點(diǎn)訪問前要判斷左右子樹已經(jīng)都訪問過了。因?yàn)榛厮莸礁腹?jié)點(diǎn)污筷,左子樹一定已經(jīng)訪問過工闺,因此就是要判斷右子樹訪問過沒有。右子樹訪問之后瓣蛀,緊接就是父節(jié)點(diǎn)的訪問陆蟆,因此可以用last變量記錄上一次訪問的地方。
判斷回溯的標(biāo)準(zhǔn)揪惦,就是當(dāng)前遍歷節(jié)點(diǎn)為nil遍搞,此時(shí)只能從棧中取一個(gè)出來罗侯。取出來的也就是父節(jié)點(diǎn)器腋,根據(jù)中序或者后序,決定是否轉(zhuǎn)到右節(jié)點(diǎn)钩杰。對于后序纫塌,訪問完父節(jié)點(diǎn)就是訪問上一個(gè)父節(jié)點(diǎn),因此當(dāng)前節(jié)點(diǎn)要置nil讲弄;對于中序措左,訪問完父節(jié)點(diǎn),訪問右子樹避除,因此轉(zhuǎn)到右子樹怎披,右子樹為空,則再轉(zhuǎn)瓶摆。?
144.?Binary Tree Preorder Traversal
Given a binary tree, return the?preorder?traversal of its nodes' values.
迭代實(shí)現(xiàn)凉逛,利用后進(jìn)先出的棧實(shí)現(xiàn),
首先利用數(shù)組實(shí)現(xiàn)一個(gè)簡單的棧群井,(也可以直接用數(shù)組寫在代碼當(dāng)中状飞,分開寫雖然需要建立的新的數(shù)據(jù)結(jié)構(gòu),但是思路會更清晰书斜,何況其他語言大部分都是有現(xiàn)成的棧結(jié)構(gòu)可用诬辈。。)
根節(jié)點(diǎn)不放棧中荐吉,當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)
?當(dāng)前節(jié)點(diǎn)不為空焙糟,則讀取當(dāng)前節(jié)點(diǎn),棧保存當(dāng)前節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)样屠,
?棧不為空穿撮,則從棧中重新取一個(gè)節(jié)點(diǎn)搓劫,迭代
94.?Binary Tree Inorder Traversal
Given a binary tree, return the?inorder?traversal of its nodes' values.
145.?Binary Tree Postorder Traversal
Given a binary tree, return the?postorder?traversal of its nodes' values.
樹的后序遍歷
注意,調(diào)用結(jié)構(gòu)體的成員混巧,要記得加先綁定到實(shí)例上枪向,不要直接使用變量名。
注意咧党,把for循環(huán)誤寫成if秘蛔,好久才發(fā)現(xiàn)!0狻I钤薄(前序是if,但是后兩者是for)
后序遍歷的關(guān)鍵就是或者轉(zhuǎn)右蛙埂,或者訪問當(dāng)前倦畅,訪問當(dāng)前,如果當(dāng)前節(jié)點(diǎn)不是空绣的,則要將當(dāng)前節(jié)點(diǎn)置空