1. 程式人生 > 實用技巧 >樹、森林的遍歷

樹、森林的遍歷

樹、森林的遍歷

樹的先根遍歷

//樹的先根遍歷
void PreOrder(TreeNode *R){
    if(R!=NULL){
        visit(R);//訪問根節點
        while(R還有下一個子樹T){
            PreOrder(T);
        }
    }
}

將上述的樹轉換為二叉樹

樹的先根遍歷序列與這棵樹相應的二叉樹的先序遍歷序列相同

樹的後根遍歷

//樹的後根遍歷
void PostOrder(TreeNode *R){
    if(R!=NULL){        
        while(R還有下一個子樹T){
            PostOrder(T);        
        }
        visit(R);//訪問根節點
    }
}

將上述樹轉換為二叉樹

樹的後根遍歷序列與這棵樹相應二叉樹的中序遍歷序列相同

樹的層次遍歷

可以稱為:廣度優先遍歷

需要用到輔助佇列來實現。

  1. 若樹非空,則根節點入隊
  2. 若佇列非空,隊頭元素出對並訪問,同時將該元素的孩子一次入隊
  3. 重複2直到佇列位空

先根和後根遍歷可以稱為:深度優先遍歷

森林的先序遍歷

若森林非空,則按如下規則進行遍歷:

  1. 訪問森林中第一棵樹的根節點
  2. 先序遍歷第一棵樹中根節點的子樹森林。
  3. 先序遍歷除去第一棵樹之後剩餘的樹構成的森林

效果等同於依次對各個樹進行先根遍歷

效果等同於依次對二叉樹的先序遍歷

森林的中序遍歷

若森林非空,則按如下規則進行遍歷:

  1. 中序遍歷森林中第一顆樹的根節點的子樹森林。
  2. 訪問第一棵樹的根節點。
  3. 中序遍歷除去第一棵樹之後剩餘的樹構成的森林。

效果等同於依次對各個樹的後根遍歷

效果等同於依次對二叉樹的中序遍歷