二叉树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 }
相关文章
相关标签/搜索