二叉樹非遞迴實現先序 中序 後序遍歷

2021-09-26 20:08:08 字數 1398 閱讀 1649

測試資料:  abc000de0f00g00  (這是乙個先序序列 ,0表示當前結點為空)

#include#includetypedef struct node  node;

char chin[100];//陣列從儲存獲取的二叉樹序列元素

int m;

int initchain(node *&q,int step)

if(q==null)

q->data=chin[step];

//printf("%c ",q->data);

step=initchain(q->lchild,++step);

step=initchain(q->rchild,++step);

}int main()

node *q;

q=null;

initchain(q,0);

}}

演算法思想:出棧乙個元素,就訪問乙個元素。

1.先是棧頂結點入棧,然後根節點出棧,(訪問當前棧頂元素)

2.如果有右孩子,則右孩子入棧,(因為先訪問左孩子,再訪問右孩子,則右孩子先入棧)

3.如果左孩子存在,左孩子入棧,然後迴圈到第1步

//先序遍歷

void xianchine(node *q)

if(p->lchild!=null)

} }}

演算法思想:出棧乙個元素,就訪問乙個元素。

1.先當前結點、當前結點的左孩子進棧。保證當前結點、及當前結點的左孩子全部進棧了

2.棧不為空時,訪問棧頂元素,棧頂元素右孩子結點進棧

3.執行第一步迴圈(注意結束迴圈的條件)

//中序遍歷

void midchine(node *q)

if(top!=-1)

} }}

演算法思想:

先序遍歷序列:1、2、3、5、4

後序遍歷序列:3、5、2、4、1

後序遍歷序列逆序:1、4、2、5、3

逆後序遍歷序列是先序遍歷過程中對左右子樹遍歷順序交換所得結果。

我們只需要將得到的逆後序遍歷結果逆序輸出即可

//後序遍歷

void lastchine(node *q)

if(p->rchild!=null)

} while(top2!=-1)

}}

先序中序後序二叉樹非遞迴實現

稍微解釋一下 先序遍歷。將根節點入棧,考察當前節點 即棧頂節點 先訪問當前節點,然後將其出棧 已經訪問過,不再需要保留 然後先將其右孩子入棧,再將其左孩子入棧 這個順序是為了讓左孩子位於右孩子上面,以便左孩子的訪問先於右孩子 當然如果某個孩子為空,就不用入棧了 如果棧非空就重複上述過程直到棧空為止,...

二叉樹先序 中序 後序 層序遍歷非遞迴實現

一 先序遍歷非遞迴實現 1.先建立乙個棧 2.把根節點放入棧中 3.迴圈取棧頂元素 4.訪問這個元素,並出棧 5.把當前元素的右子樹入棧 6.把當前元素的左子樹入棧 7.迴圈該過程 public static void preordernor treenode root 1.建立乙個棧 stacks...

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

在網上看了一些用非遞迴實現先序中序後序遍歷二叉樹的 都很混亂,while if各種組合巢狀使用,邏輯十分不清晰,把我也搞懵了。想了大半天,寫了大半天,突然開了竅,實際上二叉樹的這三種遍歷在邏輯上是十分清晰的,所以才可以用遞迴實現的那麼簡潔。既然邏輯如此清晰,那麼用非遞迴實現也應該是清晰的。自認為自己...