二叉樹遞迴 非遞迴遍歷(Java實現)

2021-08-17 22:15:13 字數 1427 閱讀 3711

遍歷是對一顆二叉樹最基本的操作,有前序遍歷、中序遍歷、後序遍歷和層次遍歷四種,都可以通過遞迴或者資料結構實現。假定葉子結構如下:

static 

classleaf

publicstring tostring()

}1.前序遍歷:先訪問其根節點,再訪問其左節點,最後訪問其右節點。

遞迴實現:先訪問其根節點,然後遞迴地去訪問其左子樹,左子樹空後再遞迴地訪問其右子樹。

public 

voidpreorder(leaf

root) }

堆疊實現:建立乙個堆疊,將節點壓棧。當棧不空時,彈出棧頂元素並訪問,如果元素的右子樹不空,則將右孩子壓棧;如果元素的左子樹不空,則將左兒子壓棧,直到棧空為止。

public 

voidpreorder2(leaf

root) }

2.中序遍歷

:先訪問其左節點,再訪問其根節點,最後訪問其右節點。

遞迴實現:從根節點出發遞迴地搜尋左子樹,直到左子樹空後,訪問當前節點。然後原路返回並訪問之前的節點,如果右子樹不為空,則再去訪問其右子樹。

public 

voidinorder(leaf

root) }

堆疊實現:將乙個節點壓棧,並沿著左子樹將全部左孩子壓棧,然後彈出棧頂元素並訪問。如果元素存在右孩子,將其壓棧並重複上面的步驟,直到棧空為止。

public 

voidinorder2(leaf

root

)if(!

stack

.isempty()) }}

3.後序遍歷:先訪問其左節點,再訪問其右節點,最後訪問其根節點。

public 

voidafterorder(leaf

root) }

堆疊實現:後序遍歷的難點必須先訪問其左右節點,再訪問其根節點。如果乙個節點是葉子節點,或者其左右孩子已經被訪問過了,這時就可以訪問該節點。可以用額外乙個節點儲存之前訪問過的左右孩子,用來確定當前的根節點是否可以訪問。

public 

voidafterorder2(leaf

root

)else}}

4.層次遍歷:逐層從左至右地訪問每乙個節點。

佇列實現:建立乙個佇列並將根節點放進去。當佇列不空時,從佇列中彈出乙個節點並訪問,如果節點的左子樹不空,將其左孩子放入佇列;如果節點的右子樹不空,將其右孩子放入佇列。

public 

voidlevelorder()

}

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

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹遞迴遍歷和非遞迴遍歷

用遞迴和非遞迴實現二叉樹的前序遍歷 中序遍歷和後序遍歷並列印出相應結果。private class treenode 在遞迴呼叫時候系統自動給我們建立棧來儲存資料,而使用非遞迴時候需要我們自己實現棧來儲存資料。遞迴實現前序遍歷public void preorder treenode root sy...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...