二叉树的前序中序后序三种遍历方式及递归算法介绍
二叉树三种遍历方式
二叉树的遍历是整个二叉树的核心,二叉树的几本操作都要依赖于遍历,对于二叉树的遍历,递归是最简单也最容易理解的,本文详细介绍了二叉树的三种遍历方法,并用递归来实现:
完整的可调试代码可看这里:二叉树全部操作的代码及其注释(从二叉树的建立,到七种遍历方式,再到各种操作)
目录
- 二叉树三种遍历方式
- 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.总结
- 先序、中序和后序遍历过程中经过结点的路线一样,只是访问各结点的时机不同。
- 下图中在从入口到出口的曲线上用⊕,☆和△三种符号分别标记出了先序、中序和后序访问各结点的时刻。
结语:
- 完整的可调试代码可看这里:
二叉树全部操作的代码及其注释(从二叉树的建立,到七种遍历方式,再到各种操作)- 这里给出了三种遍历的递归方法,递归方法虽然简洁,但可读性一般不好执行效率一般也不高。掌握了递归方法就来学习相应的非递归方法吧:
二叉树三种非递归遍历总结
二叉树的前序中序后序三种遍历方式及递归算法介绍相关推荐
- Java中List集合的三种遍历方式(全网最详)
Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...
- Java中Map集合的三种遍历方式
文章目录 Map集合的遍历方式 Map集合的遍历方式一: 键找值 Map集合的遍历方式二: 键值对 Map集合的遍历方式三: Lambda Map集合的遍历方式 Map集合的遍历方式有3种: 方式一: ...
- Java中list对象的三种遍历方式
1.增强for循环 for(String str : list) {//其内部实质上还是调用了迭代器遍历方式,这种循环方式还有其他限制,不建议使用.System.out.println(str); } ...
- MyEclipse网站服务器,MyEclipse中web服务器的三种配置方式
初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通 ...
- 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历
二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...
- [转载]二叉树先序、中序、后序三种遍历的非递归算法
本贴给出二叉树先序.中序.后序三种遍历的非递归算法,此三个算法可视为标准算法. 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem ...
- python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)
树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ######################P6.4 数据结构### ...
- C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本
本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...
- c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理
二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...
最新文章
- 数据库系统DBS的特点
- HTML-参考手册: HTTP 方法:GET 对比 POST
- kali2020进入单模式_2021神途手游:超级变态单职业
- oracle 创建临时表报权限不足,ORACLE 临时表空间满了的原因解决方案
- python基础:week three
- [html] 说说你对abbr标签的理解,它有什么含义?
- python设置单元格宽度_Python xlwt-访问现有单元格内容,自动调整列宽
- jmeter 实际运行线程数达不到设定值_Jmeter技术知识-常用组件实战演示(2020年最新)...
- windows smb更改端口_SMB协议(使用说明+过程详解+抓包分析)
- SetLayeredWindowAttributes 设置窗口透明
- Exchange server 2010系列教程之十一 整合AD RMS与exchange 2010
- 机器学习中的混淆矩阵,准确率,精确率,召回率,F1,ROC/AUC,AP/MAP
- Spring-core源码 -- AlternativeJdkIdGenerator Spring的UUID生成器类
- Sourcery G++ Lite 一个arm开发工具
- Win10下运行复活之秦殇前传
- skyline R34与R35分类器---第一次尝试
- Android AT command
- Java~通讯录系统
- 解决kibana无法启动问题
- python获取文件换行符_python – 读取文件没有换行符