遍歷概念
所謂遍歷(Traversal)是指沿著某條搜尋路線。依次對樹中每一個結點均做一次且僅做一次訪問。訪問結點所做的操作依賴於詳細的應用問題。
遍歷是二叉樹上最重要的運算之中的一個,是二叉樹上進行其他運算之基礎。
遍歷方案
1.遍歷方案
從二叉樹的遞迴定義可知,一棵非空的二叉樹由根結點及左、右子樹這三個基本部分組成。因此。在任一給定結點上,能夠按某種次序執行三個操作:
(1)訪問結點本身(N),
(2)遍歷該結點的左子樹(L),
(3)遍歷該結點的右子樹(R)。
以上三種操作有六種執行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
注意:
前三種次序與後三種次序對稱。故僅僅討論先左後右的前三種次序。
2.三種遍歷的命名
依據訪問結點操作發生位置命名:
① NLR:前序遍歷(PreorderTraversal亦稱(先序遍歷))
——訪問結點的操作發生在遍歷其左右子樹之前。
② LNR:中序遍歷(InorderTraversal)
——訪問結點的操作發生在遍歷其左右子樹之中(間)。
③ LRN:後序遍歷(PostorderTraversal)
——訪問結點的操作發生在遍歷其左右子樹之後。
注意:
因為被訪問的結點必是某子樹的根。所以N(Node)、L(Left subtlee)和R(Right subtree)又可解釋為根、根的左子樹和根的右子樹。
NLR、LNR和LRN分別又稱為先根遍歷、中根遍歷和後根遍歷。
遍歷演算法
1.中序遍歷的遞迴演算法定義:
若二叉樹非空。則依次執行例如以下操作:
(1)遍歷左子樹。
(2)訪問根結點;
(3)遍歷右子樹。
2.先序遍歷的遞迴演算法定義:
若二叉樹非空,則依次執行例如以下操作:
(1) 訪問根結點;
(2) 遍歷左子樹;
(3) 遍歷右子樹。
3.後序遍歷得遞迴演算法定義:
若二叉樹非空。則依次執行例如以下操作:
(1)遍歷左子樹。
(2)遍歷右子樹。
(3)訪問根結點。
4.中序遍歷的演算法實現
用二叉連結串列做為儲存結構,中序遍歷演算法可描寫敘述為:
void InOrder(BinTree T)
{ //演算法裡①~⑥是為了說明執行過程增加的標號
① if(T) { // 假設二叉樹非空
② InOrder(T->lchild);
③ printf("%c",T->data)。 // 訪問結點
④ InOrder(T->rchild);
⑤ }
⑥ } // InOrder