前序遍历

 template<class T>
 void BinTree<T>::PreOrder(BinTreeNode<T>*subTree){
 //前序遍历以subTree为根的树
     if(subTree!=NULL){
         cout<<subTree->data<<endl;
         PreOrder(subTree->leftChild);
         PreOrder(subTree->rightChild);
     }
 } 

中序遍历

 template<class T>
 void BinTree<T>::InOrder(BinTreeNode<T>*subTree){
 //中序遍历以subTree为根的树
     if(subTree!=NULL){//NULL是递归终止条件
         InOrder(subTree->leftChild);//中序遍历左子树
         cout<<subTree->data<<endl;//访问根结点
         InOrder(subTree->rightChild);//中序遍历右子树
     }
 }

后序遍历

 template<class T>
 void BinTree<T>::PostOrder(BinTreeNode<T>*subTree){
 //后序遍历以subtree为根的树
     if(subTree!=NULL){
         PostOrder(subTree->leftChild);
         PostOrder(subTree->rightChild);
         cout<<subTree->data<<endl;
     }
 } 

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

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

 template<class T>
 void BinTree<T>::LevelOrder(BinTreeNode<T>*subTree) {
 //层次序遍历以subTree为根的二叉树
     Queue<BinTreeNode<T>*>Q;//定义队列
     BinTreeNode<T>*p=subTree;
     Q.EnQueue(p);//根结点入队
     while(!Q.IsEmpty()){//队列不空
         Q.DeQueue(p);
         cout<<p->data;
         if(p->leftChild!=NULL) Q.EnQueue(p->leftChild);//左子入队
         if(p->rightChild!=NULL) Q.EnQueue(p->rightChild);//右子入队
     }
 }

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

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

 template<class T>
 BinTree<T>::BinTree(const BinTree<T>&s){
 //复制构造函数
     root=Copy(s.root);
 }
 template<class T>
 BinTreeNode<T>* BinTree<T>::Copy(BinTreeNode<T>*orignode){
 //返回一个指针,它给出一个以orignode为根的二叉树的副本
     if(orignode==NULL) return NULL;
     BinTreeNode<T>*temp=new BinTreeNode<T>;//创建根结点
     temp->data=orignode->data;
     temp->leftChild=Copy(orignode->leftChild);
     temp->rightChild=Copy(orignode->rightChild);
     return temp;
 } 

前序遍历的应用——判断两颗二叉树是否相等

 template<class T>
 bool equal(BinTreeNode<T>*a,BinTreeNode<T>*b){
 //为BinTree类的友元函数
     if(a==NULL&&b==NULL) return true;
     if(a!=NULL&&b!=NULL&&a->data==b->data&&equal(a->leftChild,b->leftChild)&&equal(a->rightChild,b->rightChild)) return true;
     else return false;
 }

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

 约定以输入序列中不可能出现的值作为空结点的值以结束递归,此值在RefValue中,如#
 template<class T>
 void BinTree<T>::CreatBinTree(ifstream& in,BinTreeNode<T>*&subTree){
 //以递归的方式建立二叉树
     T item;
     if(!in.eof()){//未读完,读入并建树
         in>>item;
         if(item!=RefValue){
             subTree->data=item;
             CreatBinTree(in,subTree->leftChild);//递归建立左子树
             CreatBinTree(in,subTree->rightChild);//递归建立右子树
         }
         else subTree=NULL;
     }
 } 

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

 template<class T>
 int BinTree<T>::Size(BinTreeNode<T>*subTree) const{
 //计算以subTree为根的二叉树的结点的个数
     ;//递归结束
     +Size(subTree->leftChild)+Size(subTree->rightChild);
 } 

后序遍历的应用——计算树的高度

 template<class T>
 int BinTree<T>::Height(BinTreeNode<T>*subTree) const{
 //计算以subTree为根的二叉树的高度
     ;
     +max(Height(subTree->leftChild),Height(subTree->rightChild));
 } 

二叉树BinTree4种遍历及其应用的更多相关文章

  1. HDU 1710 二叉树三种遍历

    Binary Tree Traversals Problem Description A binary tree is a finite set of vertices that is either ...

  2. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  3. Python实现二叉树的四种遍历

    对于一个没学过数据结构这门课程的编程菜鸟来说,自己能理解数据结构中的相关概念,但是自己动手通过Python,C++来实现它们却总感觉有些吃力.递归,指针,类这些知识点感觉自己应用的不够灵活,这是自己以 ...

  4. 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法

    PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...

  5. 二叉树总结—建树和4种遍历方式(递归&&非递归)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...

  6. UVA - 548 根据中序遍历和后序遍历建二叉树(关于三种遍历二叉树)

    题意: 同时给两个序列,分别是二叉树的中序遍历和后序遍历,求出根节点到叶子结点路径上的权值最小和 的那个 叶子节点的值,若有多个最小权值,则输出最小叶子结点的和. 想法: 一开始想着建树,但是没有这样 ...

  7. 基于Java的二叉树的三种遍历方式的递归与非递归实现

    二叉树的遍历方式包括前序遍历.中序遍历和后序遍历,其实现方式包括递归实现和非递归实现. 前序遍历:根节点 | 左子树 | 右子树 中序遍历:左子树 | 根节点 | 右子树 后序遍历:左子树 | 右子树 ...

  8. PTA 二叉树的三种遍历(先序、中序和后序)

    6-5 二叉树的三种遍历(先序.中序和后序) (6 分)   本题要求实现给定的二叉树的三种遍历. 函数接口定义: void Preorder(BiTree T); void Inorder(BiTr ...

  9. java实现二叉树的Node节点定义手撕8种遍历(一遍过)

    java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...

随机推荐

  1. [书接上一回]在Oracle Enterprise Linux (v5.7) 中安装DB - (4/4)

    选择自己创建的安装数据库路径. Sample Schemas 打钩. 调整内存大小. 选择官方建议的字符集编码. 是否创建创建的脚本,如需要请打钩. 脚本生成成功. 创建成功,如需要,则可以管理数据库 ...

  2. 并发工具CountDownLatch源码分析

    CountDownLatch的作用类似于Thread.join()方法,但比join()更加灵活.它可以等待多个线程(取决于实例化时声明的数量)都达到预期状态或者完成工作以后,通知其他正在等待的线程继 ...

  3. ulimit 管理系统资源

    具体的 options 含义以及简单示例可以参考以下表格. 选项 含义 例子 -H 设置硬资源限制,一旦设置不能增加. ulimit – Hs 64:限制硬资源,线程栈大小为 64K. -S 设置软资 ...

  4. C# List<object> 按特定字段排序

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  5. python列表转json树菜单

    1.列表数据 data = [ { 'id': 1, 'parent_id': 2, 'name': "Node1" }, { 'id': 2, 'parent_id': 5, ' ...

  6. Springboot 默认cache

    1:Springboot 默认缓存为ConcurrentMapCacheManager(spring-context) 2:再启动类上开启缓存 @SpringBootApplication //相当于 ...

  7. 印度黑客滥用移动设备管理服务MDM监视iPhone用户

    两周前首次亮相的印度高度针对性的移动恶意软件广告系列已被发现是针对多种平台的广泛广告系列的一部分,包括Windows设备,也可能是Android. 在本月早些时候,Talos威胁情报部门的研究人员发现 ...

  8. jmeter性能工具 使用手册(一)

    前置条件: 在jmeter官网下载jmter 安装包 电脑有java 环境 使用步骤: 打开jmeter 2.新建线程 Test plan--->add-->theads(users)-- ...

  9. JavaScript 复杂判断的更优雅写法借鉴

    前言: 我们编写js代码时经常遇到复杂逻辑判断的情况,通常大家可以用if/else或者switch来实现多个条件判断,但这样会有个问题,随着逻辑复杂度的增加,代码中的if/else/switch会变得 ...

  10. 对logistic回归分析的两重认识

    logistic回归,回归给人的直观印象只是要求解一个模型的系数,然后可以预测某个变量的回归值.而logistic回归在应用中多了一层含义,它经常应用于分类中.第一重认识:logistic是给真正的回 ...