前序遍歷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 }