二叉樹的基本的遍歷規則有三種:前序遍歷,中序遍歷和後序遍歷。對於每一種遍歷,樹中每個結點都要經過3次。前序遍歷在第一次遇到結點時立即訪問,中序遍歷第二次遇到結點時訪問,後序遍歷則到第三次遇到結點時才訪問。
中序遍歷:a + b * c – d – e / f
後序遍歷:a b c d – * + e f / -
template<class T> void BinaryTree<T>::PreOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *P)) { //遞歸函數:此算法按照前序遍歷以subTree爲根的二叉樹。 if(subTree!=NULL){ //遞歸結束條件 visit(subTree); //訪問根節點 PreOrder(subTree->leftChild,visit); //前序遍歷根的左子樹 PreOrder(subTree->rightChild,visit); //前序遍歷根的右子樹 } };
template<class T> void BinaryTree<T>::InOrder(BinTreeNode<T> *subTree, void(*visit)(BinTreeNode<T> *p)){ //遞歸函數:此算法按照中序次序遍歷以subTree爲根的子數 if(subTree!=NULL) { //如果subTree爲NULL,則結束遞歸 InOrder(subTree->leftChild,visit); //中序遍歷根的左子樹 visit(subTree); //訪問根節點 InOrder(subTree->rightChild,visit); //中序遍歷根的右子數 } };
template<class T> void BinaryTree<T>::PostOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *P)) { //遞歸函數,此算法按照後序遍歷以subTree爲根的二叉樹 if(subTree!=NULL) { //遞歸結束條件 PostOrder(subTree->leftChild,visit); //後序遍歷根的左子樹 PostOrder(subTree->rightChild,visit); //後序遍歷根的右子樹 visit(subTree); //訪問根節點 } };
轉自:http://www.itzhai.com/preorder-binary-tree-traversal-inorder-traversal-and-postorder-traversal-of-algorithm-2.html