資料結構-二叉樹的遍歷(類C語言描寫敘述)

weixin_34037977發表於2017-05-21

遍歷概念

     所謂遍歷(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


相關文章