/*////////////////////////////////////////////////////////////////////////////// // 名 稱 (Unit Name): BiTree.h 二叉樹標頭檔 // 備 注 ( Remarks ): 包含檔案棧的地址:http://www.ourys.com/post/38.html, 包含檔案隊列的地址:http://www.ourys.com/post/38.html //////////////////////////////////////////////////////////////////////////////*/ #ifndef _BITREE_H #define _BITREE_H #include "Stack.h" #include "Queue.h" template <class DataType> class BiTree; //友元類引用申明 /*-------- 樹的節點定義,將BiTree定義為友元類,便於對其操作 -----------*/ template <class DataType> class TreeNode { TreeNode():lchild(NULL),rchild(NULL){} friend class BiTree<DataType>; private: DataType data; TreeNode *lchild,*rchild; //bool tag; //後序遍曆時用的標誌域 }; /*-------- 二叉樹樹開始 -----------*/ template <class DataType> class BiTree{ public: void CreateBiTree(); //建立根節點------主過程 void CreateBiTree(TreeNode<DataType>* &p); //建立節點函數----子過程 void PreROrderTraverse(); //遞迴------先序遍曆二叉樹---主過程 void PreROrderTraverse(TreeNode<DataType>* p); //遞迴------先序遍曆二叉樹---子過程 void InROrderTraverse(); //遞迴------中序遍曆二叉樹---主過程 void InROrderTraverse(TreeNode<DataType>* p); //遞迴------中序遍曆二叉樹---子過程 void PosROrderTraverse(); //遞迴------後序遍曆二叉樹---主過程 void PosROrderTraverse(TreeNode<DataType>* p); //遞迴------後序遍曆二叉樹---子過程 void PreOrderTraverse(); //非遞迴------中序遍曆二叉樹 void InOrderTraverse(); //非遞迴------中序遍曆二叉樹 void PosOrderTraverse(); //非遞迴------後序遍曆二叉樹 void LevelOrderTraverse(); //非遞迴------層次遍曆二叉樹 protected: TreeNode<DataType>* root; //樹根 DataType temp; //代表元素為空白的符號 }; /*-------- 建立根節點----主過程--------------*/ template <class DataType> void BiTree<DataType>::CreateBiTree() { cout<<"請輸入代表元素為空白的符號:"; cin>>temp; //若換輸入方式,以上三句可以去掉 if(!(root=(TreeNode<DataType>*)malloc(sizeof(TreeNode<DataType>)))) exit(1); cout<<"請輸入資料:"<<endl; CreateBiTree(root); } /*--------建立節點函數----子過程--------------*/ template <class DataType> void BiTree<DataType>::CreateBiTree(TreeNode<DataType>* &p) { TreeNode<DataType>* px; if(!(px=(TreeNode<DataType>*)malloc(sizeof(TreeNode<DataType>)))) exit(1); cin>>px->data; if(px->data==temp) {p=NULL;free(px);} else{ p=px; // p->tag=false; //後序遍曆時用的標誌域初始化 CreateBiTree(px->lchild); CreateBiTree(px->rchild); } } /*-------- 遞迴------先序遍曆二叉樹---主過程 --------------*/ template <class DataType> void BiTree<DataType>::PreROrderTraverse() { PreROrderTraverse(root); } /*-------- 遞迴------先序遍曆二叉樹---子過程 --------------*/ template <class DataType> void BiTree<DataType>::PreROrderTraverse(TreeNode<DataType>* p) { if(p){ cout<<p->data<<" "; PreROrderTraverse(p->lchild); PreROrderTraverse(p->rchild); } } /*-------- 遞迴------中序遍曆二叉樹---主過程 --------------*/ template <class DataType> void BiTree<DataType>::InROrderTraverse() { InROrderTraverse(root); } /*-------- 遞迴------中序遍曆二叉樹---子過程 --------------*/ template <class DataType> void BiTree<DataType>::InROrderTraverse(TreeNode<DataType>* p) { if(p){ InROrderTraverse(p->lchild); cout<<p->data<<" "; InROrderTraverse(p->rchild); } } /*-------- 遞迴------後序遍曆二叉樹---主過程 --------------*/ template <class DataType> void BiTree<DataType>::PosROrderTraverse() { PosROrderTraverse(root); } /*-------- 遞迴------後序遍曆二叉樹---子過程 --------------*/ template <class DataType> void BiTree<DataType>::PosROrderTraverse(TreeNode<DataType>* p) { if(p){ PosROrderTraverse(p->lchild); PosROrderTraverse(p->rchild); cout<<p->data<<" "; } } /*-------- 非遞迴------前序走訪二叉樹--------------*/ template <class DataType> void BiTree<DataType>::PreOrderTraverse() { Stack<TreeNode<DataType>*> S; TreeNode<DataType>* p; p=root; while(p||!S.StackEmpty()){ if(p){S.Push(p);cout<<p->data<<" "; p=p->lchild;} else{ S.Pop(p); p=p->rchild; } } S.DestroyStack(); } /*-------- 非遞迴------中序遍曆二叉樹--------------*/ template <class DataType> void BiTree<DataType>::InOrderTraverse() { Stack<TreeNode<DataType>*> S; TreeNode<DataType>* p; p=root; while(p||!S.StackEmpty()){ if(p){S.Push(p); p=p->lchild;} else{ S.Pop(p); cout<<p->data<<" "; p=p->rchild; } } S.DestroyStack(); } /*--------非遞迴------後序遍曆二叉樹(沒有使用標誌域)--------------*/ template <class DataType> void BiTree<DataType>::PosOrderTraverse() { Stack<TreeNode<DataType>*> S; TreeNode<DataType>* p; TreeNode<DataType>* r; //使用r節點表示訪問了右子樹替代標誌域 p=root; while(p||!S.StackEmpty()) { if(p){S.Push(p);p=p->lchild;} else{ S.GetTop(p); if(p->rchild&&p->rchild!=r){p=p->rchild;S.Push(p);p=p->lchild;} else{S.Pop(p);cout<<p->data<<" ";r=p;p=NULL;} } } S.DestroyStack(); } /*--------非遞迴------後序遍曆二叉樹(運用標誌域,使用時請將有關tag的注釋取消掉)--------------*/ //template <class DataType> //void BiTree<DataType>::PosOrderTraverse() //{ // Stack<TreeNode<DataType>*> S; // TreeNode<DataType>* p; // p=root; // while(p||!S.StackEmpty()) // { // if(p){S.Push(p); p->tag=true;p=p->lchild;} // else{ // S.GetTop(p); // if(p->rchild&&!p->rchild->tag){ // p=p->rchild;S.Push(p);p->tag=true;p=p->lchild; // } // else{S.Pop(p);cout<<p->data<<" ";p=NULL;} // } // } // S.DestroyStack(); //} /*-------- 非遞迴------層次遍曆二叉樹 --------------*/ template <class DataType> void BiTree<DataType>::LevelOrderTraverse() { Queue<TreeNode<DataType>*> qu; TreeNode<DataType>* p; qu.EnQueue(root); while(!qu.QueueEmpty()){ qu.DeQueue(p); cout<<p->data<<" "; if (p->lchild!= NULL) qu.EnQueue(p->lchild); if (p->rchild!= NULL) qu.EnQueue(p->rchild); } } #endif
// 名 稱 (Unit Name): Stack.h 棧標頭檔// 作 者 (Author ): Hector(張偉)// 郵 箱 (E-mail ): ourys@qq.com// 支 持 (Support ): http://www.ourys.com // 備 注 (Remarks ): //////////////////////////////////////////////////////////////////////////////*/#ifndef _STACK_H#define _STACK_H#define STACK_INIT_SIZE 100 //初始棧的最大長度#define STACKINCREMENT 10 //每次新增的棧的長度template class Stack{public:Stack();void Push(DataType e); //插入為e的新棧頂元素int Pop(DataType &e); //刪除棧頂元素int GetTop(DataType &e); //取出棧頂元素int StackEmpty(); //判斷棧是否為空白:空返回1~Stack(); //棧被銷毀private:DataType *base; //棧尾DataType *top; //棧頂int stacksize;};/*———— 建構函式,建立一個新的空棧 ————–*/template Stack::Stack(){if(!(base=(DataType*)malloc(STACK_INIT_SIZE*sizeof(DataType)))) exit(1);top=base;stacksize=STACK_INIT_SIZE;}/*——– 插入為e的新棧頂元素 ————–*/template void Stack::Push(DataType e){if(top-base>=stacksize){if(!(base=(DataType*)realloc(base,(stacksize+STACKINCREMENT)*sizeof(DataType)))) exit(1);top=base+stacksize;stacksize+=STACKINCREMENT;}*top++=e;}/*——– 刪除棧頂元素 ————–*/template int Stack::Pop(DataType &e){if(top==base) return 0;e=*–top;return 1;}/*——– 取出棧頂元素 ————–*/template int Stack::GetTop(DataType &e){if(top==base) return 0;e=*(top-1);return 1;}/*———— 判斷棧是否為空白:空返回1 ————–*/template int Stack::StackEmpty(){return top==base? 1:0;}/*———— 銷毀棧 ————–*/template Stack::~Stack(){free(base);}#endif/*//////////////////////////////////////////////////////////////////////////////// 名 稱 (Unit Name): main.cpp 棧頭基本測試檔案// 作 者 (Author ): Hector(張偉)// 郵 箱 (E-mail ): ourys@qq.com// 支 持 (Support ): http://ourys.com // 備 注 (Remarks ): //////////////////////////////////////////////////////////////////////////////*/#include using namespace std;#include “Stack.h”int main(){Stack my;int a;for(int i=0;i<12;i++) my.Push(i);for(int i=0;i<12;i++){my.Pop(a);cout<}return 0;}
/*---------------- 基本測試檔案 -------*/ #include<iostream> using namespace std; #include "BiTree.h" int main(void) { BiTree<char> my; my.CreateBiTree(); my.PreROrderTraverse(); cout<<endl; my.PreOrderTraverse(); cout<<endl; my.InOrderTraverse(); cout<<endl; my.InROrderTraverse(); cout<<endl; my.PosROrderTraverse(); cout<<endl; my.PosOrderTraverse(); cout<<endl; my.LevelOrderTraverse(); return 0; }