二叉樹遍歷的非遞迴演算法實現
阿新 • • 發佈:2018-12-15
linux c++ 模板類
討論範圍
本部落格只實現二叉樹非遞迴演算法的遍歷,請自行學習二叉樹和模板類等相關知識。程式碼中附帶大量註釋,所以就不在進行詳細說明。
中序遍歷
template <typename T>void Post<T>::NInOrder11(BTNode<T> *t) { BTNode<T> *buf[MAXSIZE]; BTNode<T> *p = NULL; p = t; int top = -1; while(top != -1 || p != NULL)//判斷棧是否為空 { while(p != NULL)//判斷左子樹是否為空 { top++;buf[top] = p;//如果不為空,則進棧 p = p->lchild; } if(top != -1)//判斷棧中是否有元素 { p = buf[top];top--;//得到沒有左子樹為空的父親節點 cout<<p->data<<" ";//輸出當前節點 p = p->rchild;//找當前節點的右子樹,將右子樹賦給p,再對他進行判斷 } } }
後序遍歷
template <typename T>void Post<T>::NPostOrder11(BTNode<T> *t) {//{ BTNode<T> *buf[MAXSIZE]; BTNode<T>* p = NULL; int top = -1; p = t; //後續遍歷演算法 bool flag;//設立標誌位,用於判斷左子樹是否為空 BTNode<T> *q; do { while(p != NULL)//判斷左子樹是否為空 { top++;buf[top] = p;//將左子樹全部入棧 p = p->lchild; } q = NULL;//這個用於判斷右子樹是否為NULL flag = true;//設立標誌位,標誌左子樹已經為空 while(top != -1 && flag == true)//判斷棧是否為空,並且左子樹已經為空 { p = buf[top];//將棧中的元素取出來,賦給p,top--不能寫到這裡 //因為,如果當前節點的右子樹與上一次退棧的節點相同時 //我沒才需要進行退棧, if(p->rchild == q)//判斷右子樹是否為空 { cout<<p->data<<" ";//列印的是沒有左子樹和右子樹的節點 top--; q = p;//將上一次列印的節點記錄下來 }else { p = p->rchild;//將指標下移 flag = false;//將標誌位設定為false,意思是左子樹不為空 //並且將迴圈移出,重複do while迴圈,讓他繼續判斷右子樹的左子樹是否為空 } } } while (top != -1);//判斷棧是否為空 }
請仔細閱讀,深入理解演算法。對於以後將一些遞迴演算法轉換為非遞迴演算法,在思想上有很大幫助。在轉換上可以使用棧、佇列、陣列等均可。