非遞迴實現二叉樹的前序/後序/中序遍歷
// arr[1]如上資料,// arr[2] arr[3]
// arr[4] arr[5] arr[6]
// arr[7] arr[8]
以棧來代替遞迴實現,輸出為4,2,(遍歷右元素7,5,8).那麼就要想辦法以上面的方法入棧4,2,7,5,8的反序8,5,7,2,4
左節點出棧後的下個節點肯定是其父節點,右節點(在沒有子節點的情況下)出棧後下個節點肯定是根左節點(如節點4的下個節點是節點2, 節點8的下個節點是節點1)
step 1 遍歷左節點,入棧
step 2 出棧,然後遍歷該節點的右節點回到step1
以下為demo:
// arr[1]push:1,2,4// arr[2]
// arr[4] arr[5]
// arr[7] arr[8]
pop:4
push:7
pop:7
pop:2
push:5
pop:5
push:8
pop:8
pop:1
總結:遍歷全部左節點
pop乙個節點,push右節點
回到step1
與中序遍歷類似,把輸出的地方改為push的位置就可以了,因為先序總是以根節點開始,然後再訪問左右節點
push:1,2,4
pop:4
push:5
push:7
pop:7
push:8
pop:8
pop:5
pop:2
… 後序遍歷比較麻煩一些.
按照以下規則來記憶:
當節點為葉節點時出棧
左節點出棧後,繼續出棧右節點,再出棧自身節點,如果沒有右節點則出棧自身節點
使用雙棧實現:應該說是最簡單的
pop乙個節點到乙個棧,然後push左右節點到另乙個棧
不貼**,**下面有
參考此貼:
關於遞迴演算法和非遞迴演算法的區別和轉換的文章
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...
二叉樹非遞迴遍歷
二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...
非遞迴遍歷二叉樹
中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...