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