演算法9 演算法9 二叉樹的遍歷

2022-05-23 05:39:10 字數 2192 閱讀 8915

在這裡我們理一遍二叉樹的遞迴和非遞迴遍歷

一.前序遍歷

前序遍歷按照「根結點-左孩子-右孩子」的順序進行訪問。

1.遞迴實現

1

void preorder1(bintree *root) //

遞迴前序遍歷

29 }

2.非遞迴實現

根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後,若其左孩子不為空,按相同規則訪問它的左子樹;當訪問其左子樹時,再訪問它的右子樹。因此其處理過程如下:

對於任一結點p:

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

2)判斷結點p的左孩子是否為空,若為空,則取棧頂結點並進行出棧操作,並將棧頂結點的右孩子置為當前的結點p,迴圈至1);若不為空,則將p的左孩子置為當前的結點p;

3)直到p為null並且棧為空,則遍歷結束。

1

void preorder2(bintree *root) //

非遞迴前序遍歷213

if(!s.empty())

1419

}20 }

二.中序遍歷

中序遍歷按照「左孩子-根結點-右孩子」的順序進行訪問。

1.遞迴實現

1

void inorder1(bintree *root) //

遞迴中序遍歷

29 }

2.非遞迴實現

根據中序遍歷的順序,對於任一結點,優先訪問其左孩子,而左孩子結點又可以看做一根結點,然後繼續訪問其左孩子結點,直到遇到左孩子結點為空的結點才進行訪問,然後按相同的規則訪問其右子樹。因此其處理過程如下:

對於任一結點p,

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

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

3)直到p為null並且棧為空則遍歷結束

1

void inorder2(bintree *root) //

非遞迴中序遍歷212

if(!s.empty())

1319

}

20 }

三.後序遍歷

後序遍歷按照「左孩子-右孩子-根結點」的順序進行訪問。

1.遞迴實現

1

void postorder1(bintree *root) //

遞迴後序遍歷

2

9 }

2.非遞迴實現

後序遍歷的非遞迴實現是三種遍歷方式中最難的一種。因為在後序遍歷中,要保證左孩子和右孩子都已被訪問並且左孩子在右孩子前訪問才能訪問根結點,這就為流程的控制帶來了難題。下面介紹兩種思路。

第一種思路:對於任一結點p,將其入棧,然後沿其左子樹一直往下搜尋,直到搜尋到沒有左孩子的結點,此時該結點出現在棧頂,但是此時不能將其出棧並訪問,因此其右孩子還為被訪問。所以接下來按照相同的規則對其右子樹進行相同的處理,當訪問完其右孩子時,該結點又出現在棧頂,此時可以將其出棧並訪問。這樣就保證了正確的訪問順序。可以看出,在這個過程中,每個結點都兩次出現在棧頂,只有在第二次出現在棧頂時,才能訪問它。因此需要多設定乙個變數標識該結點是否是第一次出現在棧頂。

1

void postorder2(bintree *root) //

非遞迴後序遍歷216

if(!s.empty())

1726

else

//第二次出現在棧頂

2731}32

}33 }

第二種思路:要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,則可以直接訪問它;或者p存在左孩子或者右孩子,但是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結點。若非上述兩種情況,則將p的右孩子和左孩子依次入棧,這樣就保證了每次取棧頂元素的時候,左孩子在右孩子前面被訪問,左孩子和右孩子都在根結點前面被訪問。

1

void postorder3(bintree *root) //

非遞迴後序遍歷217

else

1824

}

25 }

二叉樹遍歷演算法

二叉樹是一種非線性的資料結構,在對它進行操作時,總是需要逐一對每個資料元素實施操作,這樣就存在乙個操作順序問題,由此提出了二叉樹的遍歷操作。所謂遍歷二叉樹就是按某種順序訪問二叉樹中的每個結點一次且僅一次的過程。這裡的訪問可以是輸出 比較 更新 檢視元素內容等等各種操作。在這裡寫了個二叉樹遍歷演算法 ...

二叉樹的遍歷演算法

遞迴演算法 void pre root 先序遍歷非遞迴演算法 void pre2 root if s.isempty 中序遍歷非遞迴 void pre2 root if s.isempty 中序遍歷的程式設計題 後序遍歷非遞迴 借助兩個棧來實現 void post if root null retu...

二叉樹的遍歷演算法

二叉樹的遍歷 二叉鍊錶typedef struct btnode btnode,bintree 三叉鍊錶typedef struct btnode btnode,bintree 二叉鍊錶和三叉鍊錶都是用來描繪二叉樹的!一 層序遍歷void levelorder bintree bt define m...