樹、森林的遍歷
樹的先根遍歷
//樹的先根遍歷
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);//訪問根節點
}
}
將上述樹轉換為二叉樹
樹的后根遍歷序列與這棵樹相應二叉樹的中序遍歷序列相同
樹的層次遍歷
可以稱為:廣度優先遍歷
需要用到輔助隊列來實現。
- 若樹非空,則根節點入隊
- 若隊列非空,隊頭元素出對並訪問,同時將該元素的孩子一次入隊
- 重復2直到隊列位空
先根和后根遍歷可以稱為:深度優先遍歷
森林的先序遍歷
若森林非空,則按如下規則進行遍歷:
- 訪問森林中第一棵樹的根節點
- 先序遍歷第一棵樹中根節點的子樹森林。
- 先序遍歷除去第一棵樹之后剩余的樹構成的森林
效果等同於依次對各個樹進行先根遍歷
效果等同於依次對二叉樹的先序遍歷
森林的中序遍歷
若森林非空,則按如下規則進行遍歷:
- 中序遍歷森林中第一顆樹的根節點的子樹森林。
- 訪問第一棵樹的根節點。
- 中序遍歷除去第一棵樹之后剩余的樹構成的森林。
效果等同於依次對各個樹的后根遍歷
效果等同於依次對二叉樹的中序遍歷