二叉樹的三種周遊,先序,中序,後序。算法
這裏給出徹底二叉樹的三種方法,其餘二叉樹大體思想也差很少。設計
遞歸方法就不用說了,一共幾行代碼。有難度的是非遞歸算法。blog
先序線序遍歷就是說最早輸出的是根節點,而後是左右孩子節點。遞歸
如圖所示,則輸出順序爲 0 1 3 7 8 4 9 2 5 6二叉樹
算法僞代碼:遍歷
開始:方法
獲得一棵樹im
根節點入棧數據
while(棧非空)img
{
節點出棧。
while(節點非葉子節點)
{
輸出節點
右孩子入棧
作孩子變爲當前節點
}
輸出節點
}
由於是徹底二叉樹,採用順序存儲相對簡單,因此我判斷是否爲葉子節點,而不是是否爲空
中序算法
開始
獲得一棵樹
根節點入棧
while(棧非空)
{
取節點
while(非葉子節點)
{
節點入棧
當前節點變爲作孩子
}
輸出當前節點
while(棧非空)
{
取出節點
if(節點有有孩子)
{
有孩子入棧
break;
}
else
輸出節點
}
}
前兩個遍歷相對簡單,後續遍歷就要複雜一點,須要咱們記錄判斷某個節點是否被輸出過
後續算法
開始
獲得一棵樹
根節點入棧
while(棧非空)
{
取節點
while(非葉子)
{
if(節點左右孩子均未輸出) //其實只判斷右孩子就行
{
節點入棧
右孩子入棧
當前節點變爲左孩子
}
else
break;
輸出節點
}
}
至於如何記錄節點是否被訪問,能夠用節點座位一個數據構造一個結構體,我直接定義了一系列bool型,由於是順序結構嘛,比較簡單。
關於中序遍歷,再補充一個本身設計的算法,原本是閉門造車,後來上網一查,找到了上面那個更好的算法,我這個算法也須要記錄節點是否被訪問
中序算法:
開始
獲得一棵樹
將根節點存入棧
while(棧非空)
{
從棧中取出節點
while(不是葉子節點)
{
if(左孩子未被輸出)
{
右孩子入棧
該節點入棧
當前節點變爲其左孩子
}
else
break;
輸出該節點
}
}