二叉樹的非遞迴遍歷

2021-09-08 23:07:04 字數 1250 閱讀 7427

非遞迴實現二叉樹的前序/後序/中序遍歷

//                 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]

// arr[2]

// arr[4] arr[5]

// arr[7] arr[8]

push:1,2,4

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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...