非遞迴遍歷二叉樹

2021-10-03 23:11:34 字數 1031 閱讀 8341

在進行二叉樹遍歷時,使用遞迴的方式來遍歷是很簡單的;我們可以採用非遞迴的方式來實現一下,即用乙個棧來儲存節點實現遍歷(迭代)。

前序遍歷

前序遍歷順序是 根-左-右;我們可以每一次都把根節點先處理,再先將右節點壓棧,最後將左節點壓棧,這樣即可實現前序遍歷。

stack

s =newstack

(); s.

push

(root)

;while

(!s.

empty()

)

中序遍歷

中序遍歷順序是 左-根-右;我們可以先把根節點壓棧,然後在一直把左節點壓棧,直到左節點無子節點;此時開始出棧,並處理,這時,我們可以判斷該節點有無右節點,有的話,再進行壓棧處理(和一開始一樣),這樣便能實現中序遍歷。

stack

s=new

stack

();do

treenode t = s.

pop();

//此時處理(列印或者儲存)

if(t.right!=null)

root=t.right;

}while

(!s.

empty()

||root!=null)

;

後序遍歷

後序遍歷順序是 左-右-根;因為棧的特徵是先進後出,我們用兩個棧,乙個表示原樹,另一位用來儲存;我們先把根節點入棧,因為我們要先把右邊的入棧,在將左邊的入棧,所有先處理右邊,在處理左邊即可。也可以這樣理解,前序遍歷是 根-左-右,後序遍歷倒過來 根-右-左,壓棧就類似於倒過來。

stack

s =newstack

(); stack

s1=newstack

(); s.

push

(root)

;while

(!s.

empty()

)//最後再進行處理

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...