二叉树BinTree4种遍历及其应用

前序遍历

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 }

后序遍历

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 } 

已知中序排列,和先序排列,可以还原二叉树,并推出后序排列。
已知中序排列,和后序排列,可以还原二叉树,并推出先序排列。
但是已知先序排列和后序排列,可能无法唯一确定二叉树。

 

层次序遍历,需要用到队列

 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 }

遍历看完后,接下来是遍历的应用以及遍历思想的应用

前序遍历的应用——复制构造函数与复制函数

 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 }

前序遍历的应用——利用前序遍历建立二叉树

 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 } 

后序遍历的应用——计算结点的个数

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 } 

 

转载于:https://www.cnblogs.com/TYXmax/p/10978658.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值