二叉树三种遍历方式
二叉树的遍历是整个二叉树的核心,二叉树的几本操作都要依赖于遍历,对于二叉树的遍历,递归是最简单也最容易理解的,本文详细介绍了二叉树的三种遍历方法,并用递归来实现:
完整的可调试代码可看这里:二叉树全部操作的代码及其注释(从二叉树的建立,到七种遍历方式,再到各种操作)
目录
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
扫描二维码关注公众号,回复:
11673444 查看本文章
用递归实现的代码
//递归后序遍历二叉树
template<typename T> void postOrder(BiTree<T> *bt)
{
if(bt == NULL) //递归调用的结束条件
return ;
postOrder(bt->left); //后序遍历递归左子树
postOrder(bt->right);//后序遍历递归右子树
visit(bt); //访问树根
}
5.总结
- 先序、中序和后序遍历过程中经过结点的路线一样,只是访问各结点的时机不同。
- 下图中在从入口到出口的曲线上用⊕,☆和△三种符号分别标记出了先序、中序和后序访问各结点的时刻。
结语:
- 完整的可调试代码可看这里:
二叉树全部操作的代码及其注释(从二叉树的建立,到七种遍历方式,再到各种操作)- 这里给出了三种遍历的递归方法,递归方法虽然简洁,但可读性一般不好执行效率一般也不高。掌握了递归方法就来学习相应的非递归方法吧:
二叉树三种非递归遍历总结