二叉樹(前中後序遞迴非遞迴遍曆,層次遍曆,C++實現)

來源:互聯網
上載者:User

/*////////////////////////////////////////////////////////////////////////////// // 名     稱 (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; } 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.