二叉樹的遍歷 非遞迴方式

2021-08-20 13:00:46 字數 2356 閱讀 1732

分別用非遞迴的方式實現二叉樹的先序遍歷、中序遍歷和後續遍歷

非遞迴方式實現二叉樹的先序遍歷。

過程:1.申請乙個新的棧,記為stack, 然後將二叉樹的頭結點head壓入stack中。

2.從stack中彈出棧頂結點,記為cur,然後列印cur結點的值,再將結點cur的右孩子(不為空的話)先壓入stack中,最後將cur的左孩子(不為空的話)壓入stack中。

3.不斷重複步驟2,直到stack為空,全部過程結束。

實現**如下:

public void preorderunrecur(node head)

if(head.left != null)}}

system.out.println();

}

非遞迴方式實現二叉樹的中序遍歷過程:1.申請乙個新的棧,記為stack。初始時,令變數cur = head;

2.先把cur結點壓入棧中,對以cur結點為頭的整棵子樹來說,依次把左邊界壓入棧中,即不停地令cur=cur.left,然後重複步驟2。

3.不斷重複步驟2,直到發現cur為空,此時從stack中彈出乙個結點,記為node。列印node的值,並且讓cur = node.right,然後繼續重複步驟2。

4.當stack為空且cur為空時,整個過程停止。

實現**如下:

public void inorderunrecur(node head)else}}

system.out.println();

}

非遞迴方式實現二叉樹的後續遍歷-實現方式一:使用兩個棧實現過程:1.申請乙個棧,記為s1,然後將樹的頭結點head壓入s1中

2.從s1中彈出的結點記為cur,然後依次將cur的左孩子和右孩子壓入s1中

3.在整個過程中,每乙個從s1中彈出的結點都放進s2裡。

4.不斷重複步驟2和步驟3,直到s1為空,過程停止。

5.從s2中依次彈出結點並列印,列印的順序就是後續遍歷的順序。

實現**如下:

public void posorderunrecur(node head)

if(head.right != null)

}while(!s2.isempty())

}system.out.println();

}

備註: 每棵子樹的頭結點都最先從s1中彈出,然後把該結點的孩子結點按照先左再右的順序壓入s1,那麼從s1彈出的順序就是從右再左,所以從s1中彈出的順序就是中、右、左。然後,s2重新收集的過程就是s1的彈出順序逆序,也就是左、右、中。所以s2從棧頂到棧底的順序就變成了左、右、中,列印出的結果就是後序遍歷的結果。

非遞迴方式實現二叉樹的後續遍歷-實現方式二:使用乙個棧實現

過程:1.申請乙個棧,記為stack,將頭結點壓入stack,同時設定兩個變數h和c。在整個流程中,h代表最近一次彈出並列印的結點,c代表stack的棧頂結點。初始時h為頭結點,c為null。

2.每次令c等於當前stack的棧頂結點,但是不從stack中彈出,此時分以下三種情況:

(1)如果c的左孩子不為null,且h不等於c的左孩子,也不等於c的右孩子,則把c的左孩子壓入stack中。解釋一下這麼做的原因,首先h的意義是最近一次彈出並列印的結點,所以如果h等於c的左孩子或者右孩子,說明c的左子樹與右子樹列印完畢,此時不應該再將c的左孩子放入stack中。否則,說明左子樹還沒處理過,那麼此時將c的左孩子壓入stack中。

(2)如果條件1不成立,並且c的右孩子不為null,h不等於c的右孩子,則把c的右孩子壓入stack中。含義是如果h等於c的右孩子,說明c的右子樹已經列印完畢,此時不應該再將c的右孩子放入stack中。否則,說明右子樹還沒被處理過,此時將c的右孩子壓入stack中。

(3)如果條件(1)和條件(2)都不成立,說明c的左子樹和右子樹都已經列印完畢,那麼從stack中彈出c並列印,然後令h = c。

3.一直重複步驟2,直到stack為空,過程停止。

實現**如下:

public void posorderunrecur2(node h)else if(c.right != null && h != c.right)else}}

system.out.println();

}

測試函式:

public static void main(string args)
測試結果:

二叉樹的遍歷方式(遞迴 非遞迴)

二叉樹的前序 中序 後序遍歷方式,遞迴與非遞迴。層序遍歷的方式已經在之前的部落格中寫過 遞迴方式比較簡單。前序遍歷 void preorder treenode root 前序遍歷非遞迴 基本思路 利用棧。先輸出結點值,再入棧。然後遍歷左子樹。退棧時,遍歷棧頂結點的右子樹。void preorder...

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

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

二叉樹非遞迴遍歷

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