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

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

一、引言
二叉树的遍历常见的方法有先序遍历、中序遍历、后序遍历和层次遍历等,本文给出了C语言版本的中序遍历二叉树的非递归算法和递归算法。
中序遍历的原理很简单,也就是把树根的访问放在中间。访问结点的次序是:“左—>根—>右”,也就是首先访问左子树,之后访问树根,最后访问右子树。对于左、右子树而言,其访问的次序依然是“左—>根—>右”。
不要小看这里的次序发生的改变,其实具体的实现方式比先序遍历也要麻烦了。
二叉树的中序遍历与先序遍历一样,都可以通过递归算法实现,也可以通过非递归算法实现。
二、二叉树的中序遍历详细演示过程
1、假设二叉树(左右子树全)如下图所示:
二叉树遍历之中序遍历算法(非递归、递归)入门详解
2、假设二叉树(没有右子树)如下图所示:
二叉树遍历之中序遍历算法(非递归、递归)入门详解
3、假设二叉树(没有左子树)如下图所示:
二叉树遍历之中序遍历算法(非递归、递归)入门详解
4、对于稍微复杂一点的二叉树,如下图所示:
二叉树遍历之中序遍历算法(非递归、递归)入门详解
其中序遍历过程演示如下(“左—>根—>右”)
二叉树遍历之中序遍历算法(非递归、递归)入门详解
二叉树遍历之中序遍历算法(非递归、递归)入门详解
二叉树遍历之中序遍历算法(非递归、递归)入门详解

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

二叉树遍历之中序遍历算法(非递归、递归)入门详解
二叉树遍历之中序遍历算法(非递归、递归)入门详解
二叉树遍历之中序遍历算法(非递归、递归)入门详解
二叉树遍历之中序遍历算法(非递归、递归)入门详解
三、先序遍历二叉树的代码:
1、算法具体实现思路
从树根开始依次向左走,见到一个结点就入栈一个,直到踏空,然后栈顶结点弹栈,弹栈结点立即访问,之后沿着该结点向右走一步,然后重复前面的动作一路向左。
2、递归算法

void  InorderSearch( BiTree *T )
{
	if( T != NULL )
	{
		InorderSearch( T->Lchild );
#ifdef CHAR
		printf( "%5c\n", T->data );
#else
		printf( "%5d\n", T->data );
#endif  
		InorderSearch( T->Rchild );
	} 
}

2、非递归算法

void InorderSearch( BiTree *T )
{
	BiTree *stack[MAX_NODE], *p = T;
	int top = 0;
	if (T==NULL) 
	{
		printf( "二叉树为空." );
		return;
	}
	while( p != NULL || top > 0 )
	{
		if( p != NULL )//遇到非空结点即压栈,之后一路向左 
		{
			stack[top++] = p; 
			p = p->Lchild;
		}
		else//遇到空节点则弹栈,访问,向右一步走 
		{
			p = stack[--top]; 
#ifdef CHAR
			printf( "%5c\n", p->data );
#else
			printf( "%5d\n", p->data );
#endif 
			p = p->Rchild;
		} 
	}
}

补充:至此,已经完成了二叉树的创建的三种不同方法、二叉树遍历的两种方法。对于中序遍历,其实还有很多方法,但是笔者比较喜欢上述方法,两个字“简单”。文章来源地址https://www.toymoban.com/news/detail-463966.html

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

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

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

相关文章

  • 二叉树遍历非递归算法

    •三种遍历 ​ • 先序遍历: 根节点–左子树–右子树 ​ • 中序遍历: 左子树–根节点–右子树 ​ • 后序遍历: 左子树–右子树–根节点 •两类算法 ​ • 递归算法(具体看我上一篇文章) ​ ♥直观,易读 ​ ♥效率低下 ​ • 非递归算法 ​ ♥ 如果一个算法可以使用递归

    2024年02月04日
    浏览(47)
  • 二叉树的非递归遍历算法

    二叉树的遍历是指访问二叉树的每个结点,且每个结点仅被访问一次。二叉树的遍历可按二叉树的构成以及访问结点的顺序分为4种方式:先序遍历、中序遍历、后序遍历和层次遍历。请至少给出其中一种遍历方式的非递归算法的思路和代码,并举例演示算法的执行过程。 算

    2023年04月24日
    浏览(41)
  • 二叉树的遍历的递归与非递归算法

    按照一定规律对二叉树的 每个结点进行访问且 仅访问一次 ; 这里的访问:可以是计算二叉树中的结点数据,打印该结点的信息,也可以是对结点进行的任何其它操作! 为什么需要遍历二叉树? 从过遍历可以得到访问结点的顺序序列,遍历操作就是将二叉树的结点按一定的

    2024年04月15日
    浏览(36)
  • 二叉树遍历的非递归算法

    非递归的算法主要采用的是循环出栈入栈来实现对二叉树的遍历,下面是过程分析 以下列二叉树为例:(图片来自懒猫老师《数据结构》课程相关内容) 1.前序遍历 前序遍历的顺序为:根结点-左子树-右子树 基本过程: (1) 访问根结点 ,将根结点入栈 (2)循环逐个访问

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

    先序遍历:先遍历一颗树的根节点,后遍历左子树,最后遍历右子树     先序遍历序列: 1 - 2 - 4 - 5 - 3 - 6 - 7 分解子问题方法 思路:将一颗二叉树看做两个部分,一个部分是左路节点,另一个部分是左路节点的右子树,先将二叉树的左路节点全部入栈,再依次出栈,出栈的

    2024年02月14日
    浏览(40)
  • 二叉树中序遍历非递归算法C语言实现

    // //  Inordertraverse.c //  二叉树链式存储 // //  Created by 丘** on 2021/7/28. // #include \\\"Inordertraverse.h\\\" #include stdbool.h #includestdlib.h typedef   struct StackNode {     int data;     struct StackNode* next;      }StackNode; typedef struct BiTNode {     int data;     struct BiTNode* lchild,* rchild;           }BiTnode

    2024年02月02日
    浏览(39)
  • 【算法第十一天7.25】二叉树前、中、后递归、非递归遍历

    树的结构 ================================================ 链接 :力扣94-二叉树中序遍历 递归 思路 1、 确定返回值和方法参数 :需要集合来存放树各节点的值,最后打印出来,所以需要一个list集合作为参数,不断迭代;除此之外不需要有返回值 2、 确定终止条件 :当前节点为空时,

    2024年02月15日
    浏览(44)
  • 递归详解,斐波那契数列、二叉树遍历、汉诺塔问题的递归代码

    一、递归详解 [1] 递归是一种编程技巧,通过函数调用自身来解决问题。递归中包含三个要素:递归定义、递归出口和递归调用。 [2] 递归定义指的是问题可以被分解为同类且更小规模的子问题。在递归过程中,问题会不断被分解为规模更小的子问题,直到达到一个基本情况,

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

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

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

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

    2024年02月22日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包