数据结构之二叉树的前序遍历、中序遍历、后序遍历(C语言实现非递归)

C语言二叉树先序、中序、后序、层次遍历 C语言二叉树先序、中序、后序、层次遍历 原先看过一遍二叉树的遍历,代码也会写,但最近再次翻看原先的笔记时发现自己写相应的代码卡壳了好久,所以又重新在网上找了先关资料总结了这篇相对来说比较齐全的二叉树遍历程序。二叉树遍历无非是先序遍历(中左右)、中序遍历(左中右)、后序遍历(左右中)、层次遍历。这里对于相应的原理不做介绍,只附带程序。 树的定义 typedef struct BitreeNode { char data; int index; struct BitreeNode *lc 阅读详情

关于二叉树的非递归实现请访问(三种遍历方式也是基于此):
数据结构之二叉树(C语言非递归实现)

栈的实现请访问:
数据结构之栈(顺序栈)

在这里插入图片描述

1、非递归前序遍历

口诀:根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根节点,然后遍历左子树,最后遍历右子树。

1.1 具体流程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 具体代码

//rootNode 为根节点 S为栈
void PerOrderTraversal(ware* S, node* rootNode)
{
	node* M;
	//node* T = rootNode;
	initWare(S); //初始化栈
	if (rootNode == NULL)
		exit(0);
	Push(S, rootNode); //根节点入栈
	printf("前序遍历:");
	while (S->top!=-1)
	{
	
		M = S->data[S->top]; //将栈顶元素给M
		Pop(S); //栈顶元素出栈
		if (M->rightChild != NULL)
			Push(S, M->rightChild);  //栈顶元素的右孩子入栈
		if (M->leftChild != NULL)
			Push(S, M->leftChild); //栈顶元素的左孩子
		printf("%c", M->data); //打印栈顶元素
	}
	printf("\n");
	printf("\n");
}

2、非递归中序遍历

中序遍历是“左根右",即先遍历左子树节点,再遍历根节点,再遍历右子树节点

2.1 具体流程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 具体代码

//rootNode 为根节点 S为栈
void MiddleOrderTraverse(node* rootNode, ware* S)
{
	initWare(S); //初始化栈
	node* visiteNode; 
	node* currentNode = rootNode;
	printf("中序遍历:");
	while (currentNode || S->top != -1)
	{
		if (currentNode)
		{
			Push(S, currentNode);
			currentNode = currentNode->leftChild;
		}
		else
		{
			visiteNode = S->data[S->top];
			Pop(S);
			printf("%c", visiteNode->data);
			currentNode = visiteNode->rightChild;
		}
	}
	printf("\n");
	printf("\n");

}

3、非递归后序遍历

后序遍历是“左右根",即先遍历左子树节点,再遍历右子树节点,最后遍历根节点

3.1 具体流程

在这里插入图片描述

3.2 具体代码

//S 栈  rootNode 根节点
void PostSwquenceTraversal(ware* S, node* rootNode)
{
	initWare(S); //初始化栈
	node* currentNode = rootNode; //当前节点指针
	node* visiteNode = rootNode; //上次访问的节点指针
	printf("后序遍历:");
	while (S->top !=-1||currentNode)
	{
		while (currentNode)
		{
			Push(S, currentNode);
			currentNode = currentNode->leftChild;
		}
		currentNode = S->data[S->top];
		//判断当前栈顶节点的右孩子是否存在,以及是否被访问过,如果没有 currentNode 指向栈顶节点的有孩子
		if (currentNode->rightChild != NULL && visiteNode != currentNode->rightChild)
			currentNode = currentNode->rightChild;
		else
		{
			//printf("后序遍历");
			printf("%c", currentNode->data); //打印栈顶元素
			visiteNode = currentNode; //visitedNode 保存出栈节点
			currentNode = NULL; //防止被访问过的节点的左孩子继续入栈
			Pop(S);
		}
	}
	printf("\n");
	printf("\n");
}

博客

C语言 二叉树的遍历(前中后序递归与迭代遍历,层序迭代遍历) 如图所示二叉树 先序遍历结果为:1 2 4 5 3 6中序遍历结果为:4 2 5 1 6 3后序遍历结果为:4 5 2 6 3 1层序遍历结果为:1 2 3 4 5 6递归的实现就是每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。而迭代法遍历的原理就是模拟递归。 一、先序遍历 递归遍历 迭代遍历 二、中序遍历 迭代遍历 阅读详情

相关推荐

C语言实现二叉树前序遍历

在计算机科学中,二叉树是一种树形数据结构,其每个节点最多有两个子节点,通常称为左右子树。该函数接收一个数组作为参数,数组中的每个元素代表一个节点的值。我们需要按照数组元素的顺序构建一棵二叉树,并返回根节点的指针。我们首先定义二叉树节点的结构体,然后实现创建二叉树的函数和前序遍历函数,最后创建示例数组,构建一棵二叉树并输出遍历结果。在创建二叉树之后,我们可以使用递归的方式实现前序遍历。实现前序遍历函数时,我们首先访问当前节点的值,然后递归遍历左子树和右子树。然后调用前序遍历函数,输出遍历的结果。

DarcyCode的博客 473

【数据结构】二叉树的前中后序遍历(C语言)

二叉树] 顾名思义就是有两个分支节点的树,不仅如此,除了叶子外的所有节点都具有两个分支节点;由于结构像一棵倒立的树,顾名思义为二叉树;如下图所示,该图即为一棵野生的二叉树;既然二叉树为树,固然有着和树一样的部分(叶子、根、分支…这些也成为了树相关的概念;二叉树除了前中后序遍历以外还有一种遍历方式叫作层序遍历,可以使用队列的FIFO特性从而完成该遍历的实现;在利用递归实现解决二叉树相关问题的过程中,可以根据实际情况选择相应的遍历方式从而以效率较高的方式解决问题;

小侯宝的博客 3260

RT-Thread NANO V4.1.1 在Cortex-M0上移植踩坑记:解决内存分配宏导致的线程创建失败

本文详细记录了RT-Thread NANO V4.1.1在Cortex-M0平台移植过程中遇到的内存分配宏配置问题,导致线程创建失败的解决方案。通过分析内存管理算法宏定义,将RT_USING_SMALL_MEM替换为RT_USING_SMALL_MEM_AS_HEAP,成功解决了线程创建问题,为开发者提供了实用的移植经验。

weixin_29189373的博客 307

『初阶数据结构 • C语言』⑮ - 二叉树的遍历(前序、中序、后序)

认识二叉树结构最简单的方式就是遍历二叉树。所谓遍历二叉树就是按照某种特定的规则,对二叉树的每一个节点进行访问,且每个节点只访问一次。二叉树遍历的规则一般有四种:前序遍历、中序遍历、后序遍历和层序遍历。其中,前三种较为简单且实现方式大同小异。1.前序遍历:先访问根节点,再遍历左右子树;2.中序遍历:先遍历左子树,再访问根节点,再遍历右子树;3.后序遍历:先遍历左子树,再遍历右子树,再访问根节点。简单记忆:前(根,左,右)、中(左,根,右)、后(左,右,根)。

花想云的博客 5512

保姆级教程:用GROMACS 2022.4的拉伸模拟(SMD)加速蛋白-蛋白组装过程

本文详细介绍了如何使用GROMACS 2022.4的拉伸分子动力学模拟(SMD)技术加速大蛋白组装过程。通过CHARMM36力场和SMD技术,将传统需要数月的蛋白结合过程缩短至数天,大幅提升模拟效率。文章包含参数设计、索引组创建、周期性边界处理等实战技巧,并提供了完整的GPU加速工作流和常见问题解决方案。

weixin_30338481的博客 446

UE5实战:如何用Mesh Shader优化你的游戏场景渲染(附性能对比)

本文深入探讨了在UE5中利用Mesh Shader优化游戏场景渲染的实战方法。通过对比传统渲染管线与GPU Driven Pipeline,详细阐述了Mesh Shader如何通过任务着色器和网格着色器两阶段并行处理,实现更精细的meshlet级剔除,从而显著降低Draw Call和GPU带宽,提升渲染性能。文章附有具体的性能对比数据与代码示例,为开发者优化高复杂度场景提供了有效路径。

sunny的博客 297

C语言数据结构二叉树的前序 中序 后序 遍历 和非递归实现的中序遍历

//二叉树的前序 中序 后序 遍历 和非递归的中序遍历 /* 二叉树的初始化 二叉树的创建 二叉树的测试函数 数据结构体 节点结构体 总的结构体 */ #include<stdio.h> #include<stdlib.h> #define MAXSIZE 1024 #define MAXNODE 100 static int id=0; typedef struct ...

Algorithm_Soul 3056

波束管理 Beam Management

Beam Management in 5G NR   波束管理,是5G NR中基于信道质量来动态选择每个UE和gNB之间以什么方向和频率的波束beam来进行通信。   背景   5G NR(New Radio)支持非常高的数据速率和更低的延迟。5G NR支持FR1和FR2频段,FR1为亚6 GHz(450至6000 MHz);FR2为毫米波段(24.25 GHz至52.6 GHz)。   由于毫米波频带使用非常高的频率,因此会导致传播损耗和其他损耗。为了补偿损失,在这种频率下定向通信是必不可少的。

最忆是江南的博客 5826

数据结构【完整代码】之(C语言实现【二叉树】创建、递归遍历(前序、中序、后序)、非递归先序遍历)

本文包含两个文件的代码和一张测试效果图: BinaryTree.h文件: 用于存储信息:存放函数、结构体、栈的函数实现、变量名等 TreeTravel.cpp文件: 用于测试 效果图:(位于最上方) 效果图: BinaryTree.h文件: #include<stdio.h> #include<stdlib.h> #define MAX_TRUE_SIZE 100 #define OK 1 #define ERROR 0 typedef int Status; typede

Zhou_LC的博客 1671

以太网物理层协议整理(2)-万兆以太网

在万兆以太网标准化过程中,IEEE和10GEA(万兆以太网联盟)是两个最重要的组织。 万兆以太网标准和规范都比较繁多,在标准方面,首先有2002年的IEEE 802.3ae,后来也不断有新的万兆以太网规范推出,如2006年的IEEE 802.3an标准(10GBase-T)就推出了基于双绞铜线的万兆以太网规范,同样的IEEE 802.3aq标准推出了基于光纤的10GBase-LRM;2007年的

NowOrNever 3万+

在 SAP S/4HANA Public Cloud 中,用 RAP 一键生成 PDF 并在 Fiori 前端触发下载的完整方案

create;update;delete;// 生成并返回当前文档上下文。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 413

二叉树非递归遍历C语言实现

二叉树非递归遍历实现——C语言实现 二叉树非递归遍历:前、中、后序三种遍历需要用到栈,层序遍历需要用到队列。首先用c语言实现栈和队列,然后再实现二叉树的非递归遍历 编程环境:Visual Studio 2010 static void Visit(Position P) {  printf("%d ", P->Data); } void PreOrder(Tree T)/

pengwenjing163的专栏 1236

【中国大学生计算机设计大赛信息可视化赛道】国奖项目深入剖析—中国古代奇异怪兽移动端可视化应用项目

【中国大学生计算机设计大赛信息可视化赛道】国奖项目深入剖析—中国古代奇异怪兽移动端可视化应用项目 注:本文主要目的是对于往年国奖项目案例-可视化项目的深入剖析讲解,对源码、项目特点、要点、特色继续深入分析。帮助大家学习技术,掌握规律。

一键难忘的博客 3730

C语言二叉树遍历问题

二叉树的遍历分为三种:前序遍历、中序遍历和后序遍历。其中,每种遍历方式都有递归和非递归两种实现方式。

欢迎来到爱吃熊掌的鱼的博客 733

MATLAB从入门到精通-APP调用simulink中的参数,并且修改,将结果返回到APP中

本次案例为以下微分方程: 其中方程的初始值为: Step1:搭建simulink文件,如下图所示: 初始值配置在积分模块中,如下图所示: Step2:制作app 操作视频: ,时长01:11 代码: 本文包括APP如何回调simulik中d的参数,以及把simulink中的仿真结果输出到APP中的绘图界面中。 核心代码如下: ...

wenyusuran的专栏 3042

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

二叉树非递归程序c语言,二叉树非递归遍历C语言实现

二叉树非递归遍历实现——C语言实现二叉树非递归遍历:前、中、后序三种遍历需要用到栈,层序遍历需要用到队列。首先用c语言实现栈和队列,然后再实现二叉树的非递归遍历详细解释参考:维基百科树的遍历http://en.wikipedia.org/wiki/Tree_traversal编程环境:Visual Studio 2010static void Visit(Position P){printf("%...

weixin_34600909的博客 945

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

二叉树的层次构建及各种常考遍历

/感觉多余//并不多余。//C语言编写,只用到了C++引用,所以建议用C++编译器;

weixin_55956317的博客 49

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

二叉树非递归遍历-用C语言描述

#define _CRT_SECURE_NO_WARNINGS #define MAXSIZE 100 #include<stdio.h> #include<stdlib.h> typedef int ElementType; ElementType NoInfo = 0; /*用0表示没有结点*/ /*============================结构体===========================================*/ /* 二叉树最常用.

Ezra1991的博客 321

数据结构——二叉树

“树”是一种重要的数据结构,采用C语言描述。 定义:有且仅有一个根结点,除根节点外,每个结点只有一个父结点,最多含有两个子节点,子节点有左右之分。 存储结构 二叉树的存储结构可以采用顺序存储,也可以采用链式存储,其中链式存储更加灵活。 在链式存储结构中,与线性链表类似,二叉树的每个结点采用结构体表示,结构体包含三个域:数据域、左指针、右指针 二叉树在C语言中的定义如下:st

李先生的专栏 703

10.二叉树前序、中序、后序及层次遍历

二叉树前序、中序、后序及层次遍历

清影的博客 109

数据结构二叉树

构建二叉树代码,前序中序后序,非递归,层次建树

weixin_45890762的博客 174

C语言实现二叉树的非递归遍历

C语言实现二叉树的非递归遍历:        代码解释:非递归前序遍历:         1&gt; 首先建立一个二维指针,用来存储每个结点的地址,定义栈顶指针top,初始值为-1,并将根结点存入栈中,top++;         2&gt; 进入while循环,栈顶指针不为-1,则进入while循环,输出当前栈顶元素p的数据域,代表前序遍历的第一个结点为根结点;         3&gt; 如果...

Future_LL的博客 1万+

数据结构初阶之基础二叉树(C语言实现)

📃博客主页:💞🚀🌏任尔江湖满血骨,我自踏雪寻梅香。万千浮云遮碧月,独傲天下百坚强。男儿应有龙腾志,盖世一意转洪荒。莫使此生无痕度,终归人间一捧黄。🍎🍎🍎❤️什么?你问我答案,少年你看,下一个十年又来了 💞 💞 💞。

wszhj_的博客 1650

数据结构入门详解(九):二叉树的三种遍历(递归+非递归超详解C语言实现)

本文系统介绍了二叉树的三种遍历方式(前序、中序、后序)的递归实现方法。详细讲解了递归遍历和非递归遍历的核心逻辑:前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。

2501_93997943的博客 657

由二叉树先序序列和中序序列求后序序列的C语言算法

#include #include #include #define NULL 0 struct btree { char num; struct btree* lchild; struct btree* rchild; }; struct stack { struct btree* base; struct btree* top; int stacksize;

youngyuan521的专栏 1062

二叉树前中后序遍历

/ 指向左孩子的指针// 指向右孩子的指针// 数据元素} BTNode;data:存储节点数据(字符类型)left:指向左子节点的指针right:指向右子节点的指针递归终止条件:节点为空时停止当前层操作:打印节点数据递归调用:分别调用左子树和右子树的遍历函数。

WQlovematch的博客 209
上一篇: 数据结构之二叉树(C语言非递归实现)
下一篇: WordPress——旅途的启程
晴空的code
博客等级 码龄5年 4粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值