二叉树三种遍历方式

二叉树的遍历是整个二叉树的核心,二叉树的几本操作都要依赖于遍历,对于二叉树的遍历,递归是最简单也最容易理解的,本文详细介绍了二叉树的三种遍历方法,并用递归来实现:


完整的可调试代码可看这里:二叉树全部操作的代码及其注释(从二叉树的建立,到七种遍历方式,再到各种操作)

目录

  • 二叉树三种遍历方式
    • 1.二叉树的结构体定义
    • 2.前序遍历二叉树
      • 算法介绍
      • 用递归实现的代码
    • 3.中序遍历二叉树
      • 算法/介绍
      • 用递归实现的代码
    • 4.后序遍历二叉树
      • 介绍及算法
      • 用递归实现的代码
    • 5.总结

1.二叉树的结构体定义

这是我的二叉树结构体的定义
//二叉树节点结构体定义
template <typename T=double>
struct BiTree{T data;BiTree<T> *left,//左子树 *right;//右子树//构造函数 BiTree(){ left = right = NULL;    } BiTree(const T &theData){  data = theData;left = right = NULL;}BiTree(const T theData,BiTree *theLeft,BiTree *theRight){data = theData;left=theLeft;right = theRight;   }
};

本文以下图所示的二叉树为例:

2.前序遍历二叉树

算法介绍

前序遍历的遍历过程为:① 访问根结点;② 先序遍历其左子树;③ 先序遍历其右子树例如下图所示的二叉树前序遍历结果为:A  B  D  F  E  C  G  H  I
也就是:  A ( B D F E )( C G  H I )

用递归实现的代码

//递归前序遍历二叉树
template<typename T>  void preOrder(BiTree<T> *bt)
{if(bt == NULL)      //递归调用的结束条件 return ;visit(bt);          //访问结点 preOrder(bt->left); //前序遍历递归左子树preOrder(bt->right);//前序遍历递归右子树
}

3.中序遍历二叉树

算法/介绍

中序遍历过程为:① 中序遍历其左子树; ② 访问根结点; ③ 中序遍历其右子树

例如下图所示二叉树的中序遍历结果为:
D B E F A G H C I
即:( D B E F ) A ( G H C I )

用递归实现的代码

//递归中序遍历二叉树
template<typename T>  void inOrder(BiTree<T> *bt)
{ if(bt == NULL)      //递归调用的结束条件 return ;inOrder(bt->left);  //中序遍历递归左子树visit(bt);          //访问树根inOrder(bt->right); // 中序遍历递归右子树 }

4.后序遍历二叉树

介绍及算法

后序遍历过程为:① 后序遍历其左子树;② 后序遍历其右子树; ③ 访问根结点

如图所示二叉树后序遍历结果为:

      D  E  F  B  H  G  I  C  A即:( D E F B )( H G I C ) A

用递归实现的代码

//递归后序遍历二叉树
template<typename T>  void postOrder(BiTree<T> *bt)
{if(bt == NULL)      //递归调用的结束条件 return ;postOrder(bt->left); //后序遍历递归左子树postOrder(bt->right);//后序遍历递归右子树 visit(bt);          //访问树根
}

5.总结

  • 先序、中序和后序遍历过程中经过结点的路线一样,只是访问各结点的时机不同
  • 下图中在从入口到出口的曲线上用⊕,☆和△三种符号分别标记出了先序、中序和后序访问各结点的时刻。

    结语:
  • 完整的可调试代码可看这里:
    二叉树全部操作的代码及其注释(从二叉树的建立,到七种遍历方式,再到各种操作)
  • 这里给出了三种遍历的递归方法,递归方法虽然简洁,但可读性一般不好执行效率一般也不高。掌握了递归方法就来学习相应的非递归方法吧:
    二叉树三种非递归遍历总结

二叉树的前序中序后序三种遍历方式及递归算法介绍相关推荐

  1. Java中List集合的三种遍历方式(全网最详)

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

  2. Java中Map集合的三种遍历方式

    文章目录 Map集合的遍历方式 Map集合的遍历方式一: 键找值 Map集合的遍历方式二: 键值对 Map集合的遍历方式三: Lambda Map集合的遍历方式 Map集合的遍历方式有3种: 方式一: ...

  3. Java中list对象的三种遍历方式

    1.增强for循环 for(String str : list) {//其内部实质上还是调用了迭代器遍历方式,这种循环方式还有其他限制,不建议使用.System.out.println(str); } ...

  4. MyEclipse网站服务器,MyEclipse中web服务器的三种配置方式

    初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通 ...

  5. 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历

    二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...

  6. [转载]二叉树先序、中序、后序三种遍历的非递归算法

    本贴给出二叉树先序.中序.后序三种遍历的非递归算法,此三个算法可视为标准算法. 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem ...

  7. python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)

    树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ######################P6.4 数据结构### ...

  8. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

  9. c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理

    二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...

最新文章

  1. 数据库系统DBS的特点
  2. HTML-参考手册: HTTP 方法:GET 对比 POST
  3. kali2020进入单模式_2021神途手游:超级变态单职业
  4. oracle 创建临时表报权限不足,ORACLE 临时表空间满了的原因解决方案
  5. python基础:week three
  6. [html] 说说你对abbr标签的理解,它有什么含义?
  7. python设置单元格宽度_Python xlwt-访问现有单元格内容,自动调整列宽
  8. jmeter 实际运行线程数达不到设定值_Jmeter技术知识-常用组件实战演示(2020年最新)...
  9. windows smb更改端口_SMB协议(使用说明+过程详解+抓包分析)
  10. SetLayeredWindowAttributes 设置窗口透明
  11. Exchange server 2010系列教程之十一 整合AD RMS与exchange 2010
  12. 机器学习中的混淆矩阵,准确率,精确率,召回率,F1,ROC/AUC,AP/MAP
  13. Spring-core源码 -- AlternativeJdkIdGenerator Spring的UUID生成器类
  14. Sourcery G++ Lite 一个arm开发工具
  15. Win10下运行复活之秦殇前传
  16. skyline R34与R35分类器---第一次尝试
  17. Android AT command
  18. Java~通讯录系统
  19. 解决kibana无法启动问题
  20. python获取文件换行符_python – 读取文件没有换行符

热门文章

  1. elisa数据处理过程图解_图解ELISA试剂盒的结果处理方法
  2. 【Linux】Shell脚本中的多任务并发执行
  3. ZYNQ图像处理项目——模板匹配数字识别(1)
  4. python xlwings使用说明_xlwings使用教程
  5. MobaXterm的Anaconda的安装
  6. 落寞的枭雄家乐福中国,如何挽回颓势?
  7. 常见的网站登录验证码种类及其解决办法
  8. 一个通知中心中台系统设计简介
  9. 银行中台系统的建设思路
  10. React-封装星星评价(支持半星、点击)拿来即用