二叉树遍历之后序遍历(非递归、递归)入门详解

这篇具有很好参考价值的文章主要介绍了二叉树遍历之后序遍历(非递归、递归)入门详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、引言

二叉树的遍历常见的方法有先序遍历、中序遍历、后序遍历和层次遍历等,本文给出了C语言版本的后序遍历二叉树的非递归算法和递归算法。
后序遍历不如先序遍历简单,是相对最复杂的一种遍历方法。访问结点的次序是:“左—>右—>根”,也就是首先访问左子树,之后访问右子树,最后访问树根。对于左、右子树而言,其访问的次序依然是“左—>右—>根”。也就是说,对于每一棵子树,都是最后访问树根。
从上面描述可以看出遍历过程其实是递归的过程,因此可以使用递归算法来实现,但是同样也可以使用非递归的方法来实现。

二、二叉树的后序遍历详细演示过程

1、假设二叉树(左右子树全)如下图所示:
二叉树遍历之后序遍历(非递归、递归)入门详解
则后序遍历过程是:左子树b—>右子树c—>树根a
2、假设二叉树(没有右子树)如下图所示:

二叉树遍历之后序遍历(非递归、递归)入门详解
则后序遍历过程是:左子树b—>树根a
3、假设二叉树(没有左子树)如下图所示:
二叉树遍历之后序遍历(非递归、递归)入门详解
则后序遍历过程是:右子树c—>树根a
4、对于稍微复杂一点的二叉树,如下图所示:
二叉树遍历之后序遍历(非递归、递归)入门详解
其后序遍历过程演示如下(“左—>右—>根”)
Step 1. 首先访问结点 d
二叉树遍历之后序遍历(非递归、递归)入门详解
Step 2. 访问结点 g
二叉树遍历之后序遍历(非递归、递归)入门详解
Step 3. 访问结点 e

二叉树遍历之后序遍历(非递归、递归)入门详解
Step 4. 访问结点b
二叉树遍历之后序遍历(非递归、递归)入门详解
Step 5. 访问结点h
二叉树遍历之后序遍历(非递归、递归)入门详解
Step 6. 访问结点f
二叉树遍历之后序遍历(非递归、递归)入门详解
Step 7. 访问结点c
二叉树遍历之后序遍历(非递归、递归)入门详解
Step 8. 访问树根a
二叉树遍历之后序遍历(非递归、递归)入门详解
至此后序遍历该二叉树结束,遍历结果为:d g e b h f c a
5、重复访问标志
在此遍历过程中,会发现树根及子树的树根会被访问两次,为了避免这个问题,第一遇到的时候不访问,而第二次遇到的时候再访问,因此引入了一个访问标志。
三、后序遍历二叉树的源代码:
1、结点结构及条件编译

typedef struct node
{
	datatype data;
	struct node *Lchild;
	struct node *Rchild;
	int    flag;
}BiTree;
#ifdef CHAR
typedef char datatype;
#else
typedef int datatype;
#endif

2、递归算法

void  PostorderSearch_Recu( BiTree  *T)
{  
	if  (T!=NULL) 
	{     
		PostorderSearch_Recu(T->Lchild) ;
		PostorderSearch_Recu(T->Rchild) ; 
		VisitNode(T->data) ;        
	}
} 

3、非递归算法

void PostorderSearch( BiTree *T )
{
	BiTree *p, *stack[ MAX_NODE ];
	int top = 0;//栈顶位置下标
	if( T == NULL ) 
	{
		return;
	}
	p = T;
	while( 1 )
	{
		if( p != NULL )//p非空,则入栈,之后p向左走 
		{
			stack[ top++ ] = p;
			p = p->Lchild;
		}
		else//p为空,则出栈 
		{
			p = stack[ --top ];
			//右为空,且flag为真,则访问,之后p置空 
			if( p->Rchild == NULL || p->flag == 1 )
			{
				VisitNode( p->data );
				p = NULL;
			} 
			else//右非空,则p重新入栈,重复入栈标志flag置为真,之后p向右走
			{
				stack[ top++ ] = p;
				p->flag = 1;
				p = p->Rchild;
			}
		} 
		if( top == 0 )//栈为空,则结束遍历
		{
			break;
		}
	}
}

4、VisitNode函数如下:

void VisitNode( datatype data )
{
#ifdef CHAR
	printf( "%5c", data );
#else
	printf( "%5d", data );
#endif
}

补充:结合前面文章中的创建二叉树的算法,就可以完整的实现二叉树创建与后序遍历二叉树了。此处不再赘叙创建的算法。文章来源地址https://www.toymoban.com/news/detail-443688.html

到了这里,关于二叉树遍历之后序遍历(非递归、递归)入门详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历

    递归与非递归实现二叉树的前序遍历、中序遍历、后序遍历。 二叉树图 定义 前序遍历(Preorder Traversal): 前序遍历的顺序是先访问根节点,然后按照先左后右的顺序访问子节点。对于上面的二叉树,前序遍历的结果是:4 - 2 - 1 - 3 - 6 - 5 - 7。 中序遍历(Inorder Traversal): 中

    2024年02月14日
    浏览(44)
  • 二叉树先序,中序,后序遍历的非递归算法(一)

    思路: 二叉树的前序遍历过程: 从树根开始沿着左子树一直深入,直到最左端无法深入时,返回; 进入最近深入时遇到结点的右子树,再进行如此的深入和返回; 直到最后从根节点的右子树返回到根节点为止; 由其深入返回的过程我们知道可以用一个栈来帮助我们消除递

    2023年04月14日
    浏览(79)
  • 用java实现二叉树的后序遍历(递归和迭代)

    目录 1.题目内容 2.用递归实现后序遍历 2.1解题思路 2.2代码 3.用迭代实现后序遍历 3.1解题思路 3.2代码 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[3,2,1] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1]

    2024年02月08日
    浏览(57)
  • 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 前序遍历的遍历方式是 先根节点 在左节点 在右节点 述这棵树前序遍历的结果是: A B D E C F G 递归的思想就是把问题拆分成一个个小问题来解决 treeNode是一个内部类 具体实现

    2023年04月26日
    浏览(52)
  • 递归和迭代实现二叉树先序、中序、后序和层序遍历

    递归比较简单,直接上代码: ### 1.1 先序遍历 1.2 中序遍历 1.3 后序遍历 能够用递归方法解决的问题基本都能用非递归方法实现。因为递归方法无非是利用函数栈来保存信息,可以寻找相应的数据结构替代函数栈,同样可以实现相同的功能。下面用栈,类比递归方法来统一实

    2024年01月20日
    浏览(42)
  • 【二叉树】1-5,理论基础、前中后序遍历的递归法和迭代法、层序遍历

    除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。 一个深度为k的有n个节点的二叉树,对树中的节点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全

    2024年02月13日
    浏览(35)
  • 算法刷题Day14 二叉树的前序、中序、后序遍历(递归、迭代、统一迭代方法)

    二叉树的定义 递归 迭代 普通的遍历(包括前序,中序和后续)迭代方法都需要借助到栈 统一迭代 统一迭代使用标记法,在栈中要处理的结点压入空指针 递归 迭代 中序遍历的迭代方法稍微特殊一点 中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问

    2024年02月15日
    浏览(48)
  • 算法练习第13天|递归实现 144.二叉树的前序遍历(opens new window)145.二叉树的后序遍历(opens new window)94.二叉树的中序遍历

    二叉树的存储方式:链式存储和顺序存储。链式存储用指针,顺序存储用数组。其结构如下图所示。 链式存储: 顺序存储: 顺序存储时,若父节点下表为i,则其左孩子下标为 2*i + 1,右孩子下标为2*i + 2. 二叉树主要有两种遍历方式: 深度优先遍历:先往深走,遇到叶子节点

    2024年02月22日
    浏览(51)
  • 数据结构与算法学习:二叉树的后序遍历的递归与非递归实现,以及非递归实现中的流程控制的说明。

    需求二叉树: 采用二叉树后序遍历非递归算法。设置一个指针p初始指向树根,p先入栈,而后使得p指向它的左孩子p-firstchild,重复操作,使得每个左孩子都依次入栈,同时初始化一个Treenode*类型的指针 pre,这个指针是后序前驱,这个后序前驱用以区分为已访问过的结点和未

    2023年04月22日
    浏览(49)
  • 根据二叉树的先序、中序、后序遍历构建二叉树-图文详解

    引言:根据一颗二叉树,可以得出他的先序、中序、后序三种遍历方式,那么如果我们知道了他的前序、中序、后序遍历,如何绘制出这颗二叉树呢? 特性A,对于前序遍历,第⼀个肯定是根节点; 特性B,对于后序遍历,最后⼀个肯定是根节点; 特性C,利⽤前序或后序遍历

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包