二叉樹BinTree4種遍歷及其應用

前序遍歷node

1 template<class T>
2 void BinTree<T>::PreOrder(BinTreeNode<T>*subTree){ 3 //前序遍歷以subTree爲根的樹
4     if(subTree!=NULL){ 5         cout<<subTree->data<<endl; 6         PreOrder(subTree->leftChild); 7         PreOrder(subTree->rightChild); 8  } 9 }

中序遍歷函數

1 template<class T>
2 void BinTree<T>::InOrder(BinTreeNode<T>*subTree){ 3 //中序遍歷以subTree爲根的樹
4     if(subTree!=NULL){//NULL是遞歸終止條件
5         InOrder(subTree->leftChild);//中序遍歷左子樹
6         cout<<subTree->data<<endl;//訪問根結點
7         InOrder(subTree->rightChild);//中序遍歷右子樹 
8  } 9 }

後序遍歷spa

1 template<class T>
2 void BinTree<T>::PostOrder(BinTreeNode<T>*subTree){ 3 //後序遍歷以subtree爲根的樹
4     if(subTree!=NULL){ 5         PostOrder(subTree->leftChild); 6         PostOrder(subTree->rightChild); 7         cout<<subTree->data<<endl; 8  } 9 }

已知中序排列,和先序排列,能夠還原二叉樹,並推出後序排列。
已知中序排列,和後序排列,能夠還原二叉樹,並推出先序排列。
可是已知先序排列和後序排列,可能沒法惟一肯定二叉樹。指針

 

層次序遍歷,須要用到隊列code

 1 template<class T>
 2 void BinTree<T>::LevelOrder(BinTreeNode<T>*subTree) {  3 //層次序遍歷以subTree爲根的二叉樹 
 4     Queue<BinTreeNode<T>*>Q;//定義隊列
 5     BinTreeNode<T>*p=subTree;  6     Q.EnQueue(p);//根結點入隊
 7     while(!Q.IsEmpty()){//隊列不空 
 8  Q.DeQueue(p);  9         cout<<p->data; 10         if(p->leftChild!=NULL) Q.EnQueue(p->leftChild);//左子入隊 
11         if(p->rightChild!=NULL) Q.EnQueue(p->rightChild);//右子入隊 
12  } 13 }

遍歷看完後,接下來是遍歷的應用以及遍歷思想的應用blog

前序遍歷的應用——複製構造函數與複製函數遞歸

 1 template<class T>
 2 BinTree<T>::BinTree(const BinTree<T>&s){  3 //複製構造函數
 4     root=Copy(s.root);  5 }  6 template<class T>
 7 BinTreeNode<T>* BinTree<T>::Copy(BinTreeNode<T>*orignode){  8 //返回一個指針,它給出一個以orignode爲根的二叉樹的副本
 9     if(orignode==NULL) return NULL; 10     BinTreeNode<T>*temp=new BinTreeNode<T>;//建立根結點 
11     temp->data=orignode->data; 12     temp->leftChild=Copy(orignode->leftChild); 13     temp->rightChild=Copy(orignode->rightChild); 14     return temp; 15 }

前序遍歷的應用——判斷兩顆二叉樹是否相等隊列

1 template<class T>
2 bool equal(BinTreeNode<T>*a,BinTreeNode<T>*b){ 3 //爲BinTree類的友元函數
4     if(a==NULL&&b==NULL) return true; 5     if(a!=NULL&&b!=NULL&&a->data==b->data&&equal(a->leftChild,b->leftChild)&&equal(a->rightChild,b->rightChild)) return true; 6     else return false; 7 }

前序遍歷的應用——利用前序遍歷創建二叉樹it

 1 約定以輸入序列中不可能出現的值做爲空結點的值以結束遞歸,此值在RefValue中,如#  2 template<class T>
 3 void BinTree<T>::CreatBinTree(ifstream& in,BinTreeNode<T>*&subTree){  4 //以遞歸的方式創建二叉樹
 5  T item;  6     if(!in.eof()){//未讀完,讀入並建樹
 7         in>>item;  8         if(item!=RefValue){  9             subTree->data=item; 10             CreatBinTree(in,subTree->leftChild);//遞歸創建左子樹
11             CreatBinTree(in,subTree->rightChild);//遞歸創建右子樹 
12  } 13         else subTree=NULL; 14  } 15 }

後序遍歷的應用——計算結點的個數class

1 template<class T>
2 int BinTree<T>::Size(BinTreeNode<T>*subTree) const{ 3 //計算以subTree爲根的二叉樹的結點的個數
4     if(subTree==NULL) return 0;//遞歸結束
5     else return 1+Size(subTree->leftChild)+Size(subTree->rightChild); 6 }

後序遍歷的應用——計算樹的高度

1 template<class T>
2 int BinTree<T>::Height(BinTreeNode<T>*subTree) const{ 3 //計算以subTree爲根的二叉樹的高度
4     if(subTree==NULL) return 0; 5     else return 1+max(Height(subTree->leftChild),Height(subTree->rightChild)); 6 }
相關文章
相關標籤/搜索