数据结构-----二叉树的非递归遍历

数据结构—二叉树的非递归建立(先序和层次)和非递归遍历(四种)   二叉树的递归建立和遍历十分简单好写,为了加深对二叉树的理解这篇文章用c++实现了二叉树的建立,遍历,以及寻找根节点和别的节点之间的路径等功能,为了实现这些功能还写了必要的栈和队列的实现。1. 二叉树节点:typedef struct Btnode { // 二叉树单个节点    char data; //可以重复    struct Btnode *rchild; //右孩子(子树)    s... 阅读详情

一、先序遍历(非递归)

1.编程思路:

        二叉树的非递归先序遍历相对与对栈 的一波操作:先判断根节点是否为空,若为空直接返回,不为空将进入以下判断,将根节点入栈,进入循环体;取栈顶元素,进行访问并对栈做出栈操作;(访问包括先将其右孩子入栈,再将其左孩子入栈,如孩子为空,则不进行入栈操作),以此方法进行循环,直至栈内无元素结束。

原二叉树图:


思维图如下所示:


2.程序代码实现:

//非递归的先序遍历二叉树
void PreOrderByLoop(TreeNode* root){
	if(root == NULL){
		//空树
		return;
	}
	//入栈
	SeqStack q;
	SeqStackInit(&q);
	SeqStackPush(&q,root);
	TreeNode value;
	while(GetStackTop(&q,&value)){
		printf("%c ",value.data);
		SeqStackPop(&q);
		if(value.rchild != NULL){
			//入栈
			SeqStackPush(&q,value.rchild);
		}
		if(value.lchild != NULL){
			//入栈
			SeqStackPush(&q,value.lchild);
		}
	}
	printf("\n");
return;}

3.代码检测:

void textPreOrderByLoop(){
	printf("\n*************%s********************\n",__FUNCTION__);
	TreeNode* A = CreatTreeNode('a');
	TreeNode* B = CreatTreeNode('b');
	TreeNode* C = CreatTreeNode('c');
	TreeNode* D = CreatTreeNode('d');
	A->lchild = B;
	A->rchild = C;
	B->lchild = D;
	PreOrderByLoop(A);
}

结果显示:


二、中序遍历(非递归)

1.编程思路

        先进行判断根节点是否为空,为空直接返回,不为空则入栈并进行以下判断:取栈顶元素,对其左子树进行判断,如果其左子树不为空,将其左子树入栈并进行循环判断,知道其左子树为空,对该栈顶元素进行访问并出栈(访问包括打印,与对其右子树的判断,若其有子树不为空,将其入栈再继续,否则直接继续进行取栈顶元素操作,进行循环)。

思维图如下所示:


2.代码实现

//非递归的中许遍历二叉树
void InOrderByLoop(TreeNode* root){
	if(root == NULL){
		//空树
		return;
	}
	//入栈
	SeqStack q;
	SeqStackInit(&q);
	SeqStackPush(&q,root);
	TreeNode* cur = root->lchild;
	while(1){
		while(cur != NULL){
			SeqStackPush(&q,cur);
			cur = cur->lchild;
		}
		TreeNode value;
		if(GetStackTop(&q,&value)){
			printf("%c ",value.data);
			cur =value.rchild;
			SeqStackPop(&q);
		}else{
			printf("\n");
			return;
		}
	}
	return;
}

3.代码检测

void textInOrderByLoop(){
	printf("\n*************%s********************\n",__FUNCTION__);
	TreeNode* A = CreatTreeNode('a');
	TreeNode* B = CreatTreeNode('b');
	TreeNode* C = CreatTreeNode('c');
	TreeNode* D = CreatTreeNode('d');
	A->lchild = B;
	A->rchild = C;
	B->lchild = D;
	InOrderByLoop(A);
}

结果显示:


三、后序遍历(非递归)

1.编程思路

         先进行判断根节点是否为空,为空直接返回,不为空则入栈并进行以下判断:取栈顶元素,对其左子树进行判断,如果其左子树不为空,将其左子树入栈并进行循环判断,知道其左子树为空,对该栈顶元素进行访问并出栈(对其右子树的判断,若其有子树不为空,(此时将其右孩子与保存值进行比较,相等则打印、出栈,否则将其右孩子入栈再继续进行右孩子的左子树判断循环体,)为空则进行打印、出栈并保存,继续进行取栈顶元素操作,进行循环,直至栈为空。

思维图如下所示:


2.代码实现

//非递归的后序遍历二叉树
void PostOrderByLoop(TreeNode* root){
	if(root==NULL){
		//空树
		return;
	}
	//入栈
	SeqStack q;
	SeqStackInit(&q);
	SeqStackPush(&q,root);
	TreeNode* cur = root->lchild;
	while(1){
		while(cur != NULL){
			SeqStackPush(&q,cur);
			cur = cur->lchild;
		}
		TreeNode value;
		TreeNode pre;
		if(GetStackTop(&q,&value)){
			while(value.rchild ==NULL||(value.rchild)->data == pre.data){
				printf("%c ",value.data);
				pre = value;
				SeqStackPop(&q);
				if(GetStackTop(&q,&value)==0){
					printf("\n");
					return;
				}
			}
			cur = value.rchild;
		}else{
			printf("\n");
			return;
		}
	}
}

3.代码检测

void textPostOrderByLoop(){
	printf("\n*************%s********************\n",__FUNCTION__);
	TreeNode* A = CreatTreeNode('a');
	TreeNode* B = CreatTreeNode('b');
	TreeNode* C = CreatTreeNode('c');
	TreeNode* D = CreatTreeNode('d');
	A->lchild = B;
	A->rchild = C;
	B->lchild = D;
	PostOrderByLoop(A);
}

结果显示:


Abaqus 气动软体抓取器:从超弹性材料建模到抓取力仿真全流程解析 本文详细解析了Abaqus在气动软体抓取器仿真中的应用全流程,涵盖超弹性材料建模、接触设置优化到抓取力仿真等关键环节。通过实战案例分享Yeoh模型参数拟合、不可伸展层建模技巧及收敛优化策略,帮助工程师高效解决有限元仿真中的常见问题,提升软体机器人研发效率。 阅读详情

相关推荐

MCGSPro动画部件实战:用文本分段实现智能报警提示(附工程文件)

本文详细介绍了在MCGSPro组态软件中,如何利用动画部件的文本分段功能,高效实现触摸屏上的智能报警提示。通过绑定整数变量作为索引,一个部件即可动态切换多种状态信息,解决了传统方法画面臃肿、维护繁琐的痛点。文章提供了从变量定义、部件配置到逻辑联动的完整实战教程,并分享了工程文件复用与性能优化技巧。

weixin_28347369的博客 167

二叉树的非递归遍历

## 二叉树的非递归遍历,无可避免要使用栈的相关知识那么下面我们就先复习一下有关于栈的基础知识。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e8ea71ac676447eaabf31dba3a83648e.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6JyC6Jyc5bCP54aK,size_20,color_FFFFFF,t_70,g_se

weixin_51756720的博客 480

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

孟孟单单的博客 7万+

6-1 栈及二叉树的非递归遍历(c++)

6-1 栈及二叉树的非递归遍历(c++) 在这里描述函数接口: #include #define MAXSIZE 100 //顺序栈存储控件的初始分配量 #define OK 1 #define ERROR 0 #define OVERFLOW -1 using namespace std; typedef int Status; typedef char TElemType; typedef struct BiTNode{ TElemType Data; struct BiTNode *lchild,*

qq_63231439的博客 351

基因家族快速鉴定指南:Windows平台下的HMMER实战解析

本文详细解析了在Windows平台下使用HMMER工具进行基因家族快速鉴定的完整实战流程。通过手把手指导,从软件获取、数据准备到模型构建与序列搜索,帮助生物信息学新手无需Linux环境,即可高效完成bZIP转录因子等家族的鉴定工作,大幅降低分析门槛。

weixin_29255731的博客 458

FPGA实战 —— 基于UART的多设备串口通信系统设计

本文深入探讨了基于FPGA的多设备UART串口通信系统设计。针对工业控制与物联网应用中一对多通信的需求,文章对比了共享总线式、多路独立式等硬件连接方案,并详细阐述了可配置UART IP核、波特率自适应算法以及多路数据仲裁与分发逻辑等核心设计要点。最后,通过一个四传感器采集节点的实战案例,展示了从硬件连接到Verilog代码实现的完整系统构建过程。

weixin_29172963的博客 234

【数据结构】二叉树之非递归遍历

本篇使用例题图解二叉树链式结构的非递归前、中、后序遍历。o(* ̄▽ ̄*)ブ

阿琪 2423

Mac电脑用Latex论文排版3天速成5天实战de笔记

我后悔了,这五天竞赛搞得我视力都下降了...一个冲动的决定后成为数模竞赛论文写手,3天速成+5天时间=点亮攻克latex写论文技能💡关于Overleaf我是Mac,曾经按照大部分推荐的方式用TEXshop+vs code,但是把模板导入就开始报错。跟着少之又少的适配mac的教程(此时我已知道大概是走错路了)改了配置也无效。海鲜市场找佬改了半天,佬问我:一定要用VC吗?我说,那倒也不是。于是佬推荐我overleaf,三下五除二帮我挑配了环境,美汁汁收了我30块钱。

luwanjoyce的博客 2247

【数据结构】二叉树的非递归遍历(完整代码)

题目描述 按要求建立一棵树(#表示空),并用非递归的方法对它进行遍历 解题思路 1.递归遍历:则将二叉树的遍历看作是分治问题,将每一棵树都分为根-左子树-右子树三部分,每部分按同样的方法递归遍历即可。具体实现见下篇博客 [二叉树的实现&递归遍历](https://blog.youkuaiyun.com/ly_6699/article/details/87891642) 2.非递归遍历:我们可以借用栈的知识完成树的遍历。使用栈完成的过程以下面的前序遍历为例

ly_6699的博客 3219

手把手教你学simulink实例--Simulink在电动汽车故障诊断与预测中的应用仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车故障诊断与预测仿真。该系统能够全面评估故障诊断与预测算法的性能,验证其在不同故障场景下的有效性,并通过优化设计提高系统的可靠性和安全性。引入智能算法:结合人工智能技术,实现更智能的故障诊断与预测。扩展功能:增加对多种车型和故障类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

MHD0815的博客 256

基于Blender的AI插件——2D图片生成3D模型

只需5分钟即可从图片到可编辑3D模型,支持Blender全版本兼容。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2576

【数据结构】(二叉树)二叉树的后序遍历非递归

二叉树的后序遍历非递归 算法思想:迭代写法,利用pre记录上一个访问过的结点,与当前结点比较,如果是当前结点的子节点,说明其左右结点均已访问,将当前结点出栈,更新pre记录的对象。** //结构体 typedef struct BiTree{ char data; BiTree *lchild; BiTree *rchild; }BiTree; //访问结点 void visit(...

你好丶下一秒 9783

Python爬虫实战:美团外卖商家数据抓取与分析

随着互联网技术的快速发展,外卖平台已成为人们日常生活中不可或缺的一部分。本文基于Python爬虫技术,使用最新的异步爬虫框架和反爬虫绕过技术,实现了对美团外卖平台商家信息与评分数据的自动化抓取。通过对抓取数据的清洗、存储和分析,为餐饮行业市场研究和商业决策提供数据支持。本文详细介绍了爬虫的设计思路、技术实现方案、数据处理方法以及可视化分析结果,为相关领域的研究者和开发者提供参考。关键词:Python爬虫;美团外卖;数据抓取;数据分析;异步爬虫。

2201_76125261的博客 1822

【数据结构】遍历二叉树(递归和非递归遍历的先序、中序和后序遍历、层次遍历法)

二叉树 递归和非递归遍历的先序、中序和后序遍历、层次遍历法

ChenZHIHAO_y的博客 1972

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Java数据结构】二叉树的前中后序遍历(递归和非递归)

*这段代码还有一个问题 我们外层的循环条件是cur!=null 但是我们在cur获取到D的右子节点时 此时cur又为空了 此时循环条件不满足 循环就结束了 但是我们还没有遍历完这棵二叉树 我们还有什么依据来继续循环呢?我们不采用递归的方式 但是要模拟递归的思路。**递归实现的代码都十分相似 **例如这颗树 我们用它举例。前序遍历的遍历方式是。

m0_72670269的博客 2037

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【高阶数据结构】二叉树的非递归遍历

但行好事,莫问前程

qq_42996461的博客 1765

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

数据结构学习——树形结构之非递归遍历二叉树

本文为大家介绍了数据结构学习——树形结构之非递归遍历二叉树,希望对你有帮助~~

weixin_53919192的博客 1947

【数据结构】--- 二叉树的递归遍历和非递归遍历【C语言实现】

目录 1. 创建一颗二叉树 2.递归前序遍历二叉树 3.递归中序遍历二叉树 4.递归后序遍历二叉树 5. 测试递归打印二叉树代码 6. 非-递归前序遍历二叉树 7.非-递归实现中序遍历二叉树 8.非 - 递归实现后序遍历【较为复杂的方法】 9.非 - 递归实现后序遍历【简单的方法】 10. 二叉树的层次遍历 11. 最后:附全部代码: 对于二叉树的非递归 深度优先遍历,使用的都是栈 对于二叉树的层次遍历,使用的是队列 1. 创建一颗二叉树 依据前序遍...

mike_jun的博客 3万+

【数据结构】二叉树遍历的非递归实现

“ Ctrl AC!一起 AC!” 目录 二叉树结点数据结构: 定义一个顺序栈及其操作: 前序遍历的非递归实现: 中序遍历的非递归实现: 后序遍历的非递归实现: 非递归主要依靠用一个栈记录回溯点,进行回溯。 二叉树结点数据结构: typedef char datatype; typedef struct node{ datatype data; struct node *lchild,*rchild; }bintnode; typedef bintnode *bintree; b

Ctrl AC的博客 1306

数据结构——二叉树的非递归遍历

二叉树的非递归遍历 一.非递归先序遍历 递归的方式遍历是指就是利用了函数压栈的特点,我们根据这个特点可以自己设计栈来实现非递归遍历的方式。 先序遍历的过程: 代码: //非递归的先序遍历 void preOrderNoR(TreeNode* root) { //从根节点进入,根节点入栈, //打印根节点,根节点出栈,并将根节点的非空左孩子入栈 //如果左孩子为空,就入其右孩子...

Wz_still_shuai的博客 882

[数据结构][Python]实现遍历二叉树(递归和非递归)

class Node(object): def __init__(self,value=None,left=None,right=None): self.value = value self.left = left self.right = right def pre_traverse(root): """ 前序遍历 ...

Twiss的博客 2073

【数据结构】非递归实现二叉树的先序遍历

非递归实现二叉树的先序遍历

每天进步一点丶的博客 4504

数据结构之---非递归中序遍历二叉树

二叉树中序非递归遍历算法实现 大家好,我是刚刚起步的萌新,最近在学数据结构,此次为大家分享二叉树的中序非递归遍历算法,实现及差错修改。 1.第一步呢我们需要创建二叉树,栈,基本栈方法这些我们就不一一说了,网上有很多。或可以联系我qq3434394197,代码如下: #include "stdio.h" #include "stdlib.h" #define MaxSize 50 typedef i...

weixin_44462351的博客 7126

创建的二叉树后续非递归遍历结果为_数据结构(六):二叉树的遍历

本节课我们继续二叉树的话题。二叉树的性质这节课,先介绍一下二叉树的几个相关的性质,这些性质很简单,但却是我们进行数据结构的性能分析的基础。1. 在二叉树的第 i 层上至多有 个结点。这个性质是显然的,第一层有1个,第二层最多只可能是第1层的两倍,第三层是第二层的两倍。2. 深度为 k 的二叉树,最多有 个结点。这条性质由 1 可以直接得出:将每一层的最大结点数相加。这是一个公比为 2 的等比数...

weixin_39978749的博客 113
上一篇: 数据结构-----二叉树的镜像实现
下一篇: Linux-----gdb的多线程调试
CYD、孤狼
博客等级 码龄9年 24粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值