二叉樹三種遍歷方式 非遞迴

2021-09-01 13:58:42 字數 2035 閱讀 9466

二叉樹的先序、中序、後序遍歷,採用非遞迴實現。

非遞迴實現的乙個基本思路:在遍歷的過程中要用棧來儲存遍歷中經過的結點。

#include#includetypedef char datatype;

//定義二叉樹型別的節點

typedef struct btnodebtree;

//建立二叉樹,以先序的方式輸入,如果左孩子或右孩子為空,則輸入#

/* 例子 a 輸入為:abd##e##cf###

/ \b c

/ \ /

d e f

*/void createbtree(btree * &t)}/*

根據先序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,

因此可以直接訪問,訪問完之後,若其左孩子不為空,按相同規則訪問它的左子樹;

當訪問完其左子樹時,再訪問它的右子樹。因此其處理過程如下:

對於任一結點q:

1)訪問結點q,並將結點q入棧;

2)判斷結點p的左孩子是否為空,若為空,則取棧頂結點並進行出棧操作,

並將棧頂結點的右孩子置為當前的結點q,迴圈至1);

若不為空,則將q的左孩子置為當前的結點q;

3)直到棧為空,則遍歷結束。

*///非遞迴先序遍歷

void preorder(btree * root)

if(0!=top)

else

break; }}

/*根據中序遍歷的順序,對於任一結點,優先訪問其左孩子,而左孩子結點又可以看做一根結點,

然後繼續訪問其左孩子結點,直到遇到左孩子結點為空的結點才進行訪問,

然後按相同的規則訪問其右子樹。因此其處理過程如下:

對於任一結點p,

1)若其左孩子不為空,則將q入棧並將p的左孩子置為當前的q,然後對當前結點q再進行相同的處理;

2)若其左孩子為空,則取棧頂元素並進行出棧操作,訪問該棧頂結點,然後將當前的q置為棧頂結點的右孩子;

3)直到棧為空則遍歷結束

*///非遞迴中序遍歷

void inorder(btree * root)

if(0!=top)

else

break;//棧空時停止 }}

/*後序遍歷的非遞迴實現是三種遍歷方式中最難的一種。因為在後序遍歷中,

要保證左孩子和右孩子都已被訪問並且左孩子在右孩子前訪問才能訪問根結點,

這就為流程的控制帶來了難題。下面介紹兩種思路。

第一種思路:

對於任一結點q,將其入棧,然後沿其左子樹一直往下搜尋,直到搜尋到沒有左孩子的結點,此時該結點出現在棧頂,

但是此時不能將其出棧並訪問,因為其右孩子還沒被訪問。所以接下來按照相同的規則對其右子樹進行相同的處理,

當訪問完其右孩子時,該結點又出現在棧頂,此時可以將其出棧並訪問。這樣就保證了正確的訪問順序。

可以看出,在這個過程中,每個結點都兩次出現在棧頂,只有在第二次出現在棧頂時,才能訪問它。

因此需要多設定乙個變數標識該結點是否是第一次出現在棧頂。

*///非遞迴後序遍歷 方法一

void postorder1(btree * root)

if(0!=top)

else//第二次出現在棧頂

}else

break; }}

/*第二種思路:

要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點q,先將其入棧。

如果q不存在左孩子和右孩子,則可以直接訪問它;或者q存在左孩子或者右孩子,但是其左孩子和右孩子都已被訪問過了,

則同樣可以直接訪問該結點。若非上述兩種情況,則將q的右孩子和左孩子依次入棧,

這樣就保證了每次取棧頂元素的時候,左孩子在右孩子前面被訪問,左孩子和右孩子都在根結點前面被訪問。

*///非遞迴後序遍歷 方法二

void postorder2(btree * root)

else

if(top==0)

break; }}

int main()

二叉樹三種遍歷方式 遞迴和非遞迴

樹形結構是一類重要的非線性資料結構。其中以樹和二叉樹是最為常用。二叉樹有四種遍歷順序 先序遍歷 前序遍歷 中序遍歷,後序遍歷,層序遍歷。這三種遍歷的方式其實是由遍歷的根結點的順序來定義的。先序遍歷 先訪問根結點,再遍歷它的左子樹,最後遍歷它的右子樹。中序遍歷 先遍歷左子樹,然後訪問根結點,最後遍歷它...

二叉樹三種遍歷方式非遞迴實現

1.中序遍歷 應為輸出的子樹根的關鍵字位於其左子樹關鍵字值和右子樹的關鍵字值之間 同理,先序後序遍歷。1.先序遍歷非遞迴演算法 define maxsize 100 typedef struct sqstack void preorderunrec bitree t endwhile if stac...

二叉樹三種遍歷方式的非遞迴實現

說明 include include include include include 棧using namespace std define n 100 最大節點個數 typedef struct mybinarytree bt bt createbt char pre,char in,int k ...