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

二叉树三种遍历方式

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


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

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.总结

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

猜你喜欢

转载自blog.csdn.net/qq_45768060/article/details/105791624