二叉树中序遍历和后序遍历的递归与非递归算法

二叉树的基本操作(先序序列创建二叉树/先序遍历递归算法/中序遍历递归算法/后序遍历递归算法/求二叉树深度的递归算法) 二叉树的存储结构有顺序存储和链式存储两种存储方式,这里我们采用使用频率较高的链式存储方式(二叉链表)来存储二叉树. 下面给出二叉树结点的定义. struct BiTreeNode//二叉树结点定义 { BiTreeNode* LChild;//左孩子指针域 int data; BiTreeNode* RChild;//右孩子指针域 }; ... 阅读详情

昨天写的前序遍历的递归与非递归算法,在非递归算法中主要还是借用到了栈这一工具,其实在中序遍历和后序遍历中依旧可以理由栈的特性来进行非递归的遍历 操作。


1.中序遍历

1.1 中序遍历的递归算法

二叉树的构造以在上一篇博文中有说到,这里就不再重复了,直接上代码

public void InOrderTraverse(TreeNode T){
		
		if(T==null){
			return;
		}
		InOrderTraverse(T.lchild);
		System.out.println(T.data);
		InOrderTraverse(T.rchild);
		
	}

运行结果如下图


1.2 中序遍历的非递归算法


非递归算法的思路主要分为 将结点压入栈 和 从栈中弹出结点两部分,具体代码如下

public void InOrderWithoutRecursion(TreeNode T){
		
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode p;
		while(T!=null||!stack.empty()){
			
			while(T!=null){             //将结点压进栈中
				stack.push(T);
				T = T.lchild;
			}
			
			if(!stack.empty()){         //将栈中的结点弹出
				p = stack.peek();  
				stack.pop();
				System.out.println(p.data); 				
				T = p.rchild;			
			}
		}
				
	}

运行结果如下



2.后序遍历

2.1后序遍历的递归算法

其实在对比之后可以发现,前序、中序、后序算法的递归算法相似度非常高,差别仅仅在于对结点进行处理的那行或者那段代码的位置不同,所以非常好记,看看具体代码

public void postOrderTraverse(TreeNode T){
		
		if(T==null){
			return;
		}
		postOrderTraverse(T.lchild);
		postOrderTraverse(T.rchild);
		System.out.println(T.data); //对结点进行处理,这里以输出代替
		
	}

输出结果为


2.2 后序遍历的非递归算法

后序遍历的非递归算法也主要分为 将结点压入栈 和 从栈中弹出结点 两部分,但是后序遍历比中序遍历多了HashMap用来作为标记,当value为1时,表示key对应的结点的右孩子已经被便利过,value为0时表示未遍历过。

public void postOrderWithoutRecursion(TreeNode T){
		
		Map<Object,Integer> flag = new HashMap<Object,Integer>(); //结点右孩子是否被遍历过的标记
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode p;
		while(T!=null||!stack.empty()){
			
			while(T!=null){
				stack.push(T);
				flag.put(T.data, 0);       //当结点被压入栈时,将value初始化为0
				T = T.lchild;
			}
			
			if(!stack.empty()){
				p = stack.peek();				
				if(p.rchild!=null&&flag.get(p.data)!=1){
					T = p.rchild;
					flag.put(p.data, 1);     //表示p结点的右孩子已经被遍历过
				}else{
					stack.pop();
					System.out.println(p.data);
				}							
			}
			
		}
	}

输出结果为


后序遍历非递归修改版

public void postOrder(TreeNode root){
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode hasOrder = null;
		TreeNode node;
		while(root!=null||!stack.empty()){
			while(root!=null){
				stack.push(root);
				root = root.left;				
			}
			
			if(!stack.empty()){
				node = stack.peek();
				if(node.right!=null&&hasOrder!=node.right){
					root = node.right;
				}else{
					System.out.println(node.value);
					hasOrder = node;
					stack.pop();
				}
				
			}
	
	    }
	}







算法:二叉树的先序遍历、中序遍历、后序遍历(递归及非递归方式)的java代码实现 首先来看一棵二叉树: 1、前序遍历: 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。 若二叉树为空则结束返回,否则: (1)访问根结点; (2)前序遍历左子树; (3)前序遍历右子树 ; 需要注意的是:遍历左右子树时仍然采用前序遍历方法。可以看出前序遍 阅读详情

相关推荐

实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法

#include"iostream" #define maxsize 50 using namespace std; class node{ private: char data; node* lchild; node* rchild; public: void createnode(node *&,char *); void fnode(node* b) { if(b!=NULL

Stay hungry 4755

二叉树前序、中序、后续遍历递归和非递归C++实现(带详细注释)

实现代码如下,带有详细注释: #include <iostream> #include <stack> // 定义的树结构体 struct TreeNode{ int val; TreeNode* leftTree; TreeNode* rightTree; }; /* 二叉树的先序遍历,递归方法 */ void preOrder(TreeNode* root) { if(root != nullptr) { cout &lt

XMJYever的博客 403

GoPro官方API实战:从蓝牙配对到Wi-Fi流媒体,构建跨平台控制应用

本文详细解析了GoPro官方API的开发实践,涵盖蓝牙配对、Wi-Fi流媒体控制等关键技术。通过实战案例,指导开发者如何构建跨平台控制应用,解决设备发现、指令解析、视频流传输等核心问题,并分享Android平台迁移经验与常见问题排查方法。

weixin_30727835的博客 397

二叉树的前中后序遍历的递归及非递归算法

144. 二叉树的前序遍历 1.递归 递归时间复杂度:O(N),N为二叉树结点的个数 class Solution { List<Integer> res = new LinkedList<>(); public List<Integer> preorderTraversal(TreeNode root) { if(root !=...

qq_41342326的博客 876

FANUC机器人RSR与PNS功能深度解析及实战应用指南

本文深度解析了FANUC机器人RSR(远程程序启动)与PNS(程序号选择)两大核心功能。文章详细阐述了RSR的队列执行机制与PNS的二进制编码原理,提供了从硬件连接到参数配置的完整实战指南,并分享了混合使用策略与常见故障排除方法,旨在帮助工程师实现高效、稳定的生产线自动化程序调度。

neovim7hacker的博客 307

AI气象预报:数值模式融合与短临预警的工程实践

气象预报正经历从物理推演到数据驱动的认知范式转变。AI气象预报并非替代传统数值模式,而是通过数值模式融合弥补其在参数化误差、初值敏感性和计算效率上的固有瓶颈。其技术价值在于提升短临预警时效性与空间精度,支撑航空调度、电力调控、防洪应急等关键场景。实践中需兼顾物理一致性、可解释性与业务系统兼容性,避免纯黑箱建模带来的外推失效与不确定性缺失风险。本文聚焦AI作为超分辨率引擎、误差矫正器和短临加速器的三类落地路径,解析HEALPix投影、多尺度图建模、轻量级U-Net等核心适配方法。

weixin_28221501的博客 298

二叉树3种遍历算法递归与非递归实现详解

  一, 二叉树先序遍历的实现     递归实现 void PreOrderTraverse(BiTree T) { if( T ) { VisitF(T-&gt;data);//访问根节点 PreOrderTraverse(T-&gt;lchild);//递归左子树 PreOrderTraverse(T-&gt;r...

年少很低调 1万+

从谱峰搜索到多项式求根:Root-MUSIC算法原理与MATLAB实践

本文深入解析Root-MUSIC算法在阵列信号处理中的原理与应用,通过多项式求根替代传统MUSIC算法的谱峰搜索,显著提升计算效率和精度。文章详细介绍了算法核心思想、MATLAB实现步骤及工程优化技巧,帮助读者掌握这一高效的DOA估计方法。

weixin_30832143的博客 80

二叉树前、中、后序遍历的递归和非递归算法

采用递归式的方法代码就很简洁,不多说明,如下。重点是非递归方法,非递归要借助栈来实现。 以先序为例,遍历顺序为根-左-右。根节点先进栈,然后判断栈是否为空,不为空则进行出栈并打印出出栈的节点的值,接着判断该出栈节点有无左右孩子节点,若有,则按照右孩子先,左孩子后的顺序进栈。接着继续判断栈是否为空,不为空则进行出栈和打印值得操作,并判断出栈的节点有无左右孩子......按照这种方式一直进行,容易看出,这个循环的条件是栈中还有元素,即栈非空。 package bitree; import ja..

weixin_50826529的博客 215

Glue)《Multi-omics single-cell data integration and regulatory inference with graph-linked embedding》

论文引入GLUE框架,通过知识引导图(guidance graph)显式建模跨层调控交互,桥接特征空间,实现准确、鲁棒、可扩展的整合。近年来,单细胞测序技术(如scATAC-seq用于染色质可及性、snmC-seq用于DNA甲基化、scRNA-seq用于转录组)允许同时探测多个组学层,揭示细胞异质性和调控机制。GLUE优于现有方法:桥接特征空间,避免信息丢失,支持多组学和调控推断。用于整合未配对的单细胞多组学数据(如scRNA-seq、scATAC-seq和snmC-seq),并同时进行调控交互推断。

m0_58293236的博客 1151

zabbix深度监控之邮件告警、微信群和微信告警

本文详细介绍了Zabbix监控系统实现邮件告警和微信告警的配置方法。邮件告警部分包含QQ和163邮箱的SMTP服务器配置、消息模板设置、告警流程三步骤(媒介配置、触发器动作、用户设置)。微信告警分为两种方式:企业微信群机器人告警(通过webhook实现)和企业微信应用告警(需创建应用并获取API参数)。两种告警方式都提供了完整的配置流程,包括脚本编写、权限设置、消息模板定制等关键步骤,并特别说明了如何使个人微信接收企业微信告警消息。文章还对比了SMTP、POP3、IMAP三种邮件协议的差异及适用场景。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 815

二叉树的遍历的递归与非递归实现

二叉树的遍历问题1.递归序2.递归方法遍历二叉树3.非递归方法遍历前序遍历后序遍历:中序遍历:小结: 1.递归序 抛开二叉树的遍历。我们来单看一个普通的递归函数: public static void DiGui(Tree node){ if(node == null){ return; } /* 节点第一次到达DiGui函数体 */ System.out.println("first time:" + node.val

a760352276的博客 1555

深度强化学习训练结果曲线绘制教程

使用python语言,只调用matplotlib库,绘制训练过程中保存的强化学习训练曲线。模仿经典论文中的训练曲线,多次训练取平均,并绘制出阴影区域。

加斯顿工程师的博客 910

二叉树先序遍历、中序遍历、后序遍历的递归算法与非递归算法

首先是二叉树数据结构的定义: typedef struct TNode *Position; typedef Position BinTree; /* 二叉树类型 */ struct TNode{ /* 树结点定义 */ int Data; /* 结点数据 */ BinTree Left; /* 指向左子树 */ BinTree Right; /* 指向右...

弱爆了的雪饼的博客 6367

uniapp [全端兼容] - 实现集成配置百度语音识别转文字,长按或开启录音并将录音文件实时转换为文字,百度智能云API实现上传录音文件并转换成文字案例(苹果安卓App、微信小程序、移动端H5网页)

uniapp对接百度智能云语音识别,uniapp中实现语音识别(app+小程序),百度语音识别录音转文字_百度智能云,uniapp使用百度语音识别语音转文字,uniapp小程序调用百度语音识别,uni-app 百度语音识别文字并展示功能,uniapp配置自定义界面百度语音识别转文字和原生使用方式,uniapp使用百度语音,uni-app语音转文字功能,使用UniApp技术实现录音并将录音转换为文字,uniapp如何实现语音输入功能功能,Uniapp集成百度智能云API实现录音转文字详细教程完整示例代码dem

🏆 前端领域优质创作者 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

二叉树的遍历(先序遍历,中序遍历,后序遍历)递归与非递归算法

二叉树的遍历算法,前序遍历,中序遍历,后续遍历。算法的分析和实现(递归和非递归)

Tianzhenchuan的博客 989

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

详解二叉树的遍历问题(前序、后序、中序、层序遍历的递归算法及非递归算法及其详细图示)

文章目录二叉树的遍历先序遍历 二叉树的遍历  所谓二叉树的遍历,是指按照某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,且仅被访问一次。  由二叉树的递归定义可知,遍历一棵二叉树便要决定对根结点N、左子树L和右子树R的访问顺序。按照先遍历左子树再遍历右子树的原则,常见的遍历次序有先序(NLR)、中序(LNR)和后序(LRN)三种遍历算法,其中“序”指的是根结点在何时被访问。 先序遍历  先序遍历(PreOrder)的操作过程如下: ...

薛定谔的猫的博客 1861

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

用堆栈实现二叉树的前序遍历/中序遍历/后序遍历的非递归算法

用堆栈实现二叉树的前序遍历/中序遍历/后序遍历的非递归算法算法思想中序遍历前序遍历后续遍历 算法思想 借助堆栈实现前序遍历、中序遍历非递归程序的本质是利用堆栈模拟递归函数调用时的入栈和出栈过程。而前序遍历、中序遍历和后序遍历在递归函数执行时,结点(作为函数参数)的入栈和出栈过程是完全一样的。 前序遍历是在结点入栈时输出结点信息,然后开始分别对该结点左右子树的遍历;而在中序遍历中,结点出栈时表明刚完成对该结点左子树的遍历,此时可输出该结点信息。 后序遍历必须在左右子树均输出的情况下才能输出该结点。

White_Beard_C的博客 1952

二叉树先序遍历、中序遍历、后序遍历 递归和非递归算法

一、二叉树先序遍历 (1)递归算法 // 递归先序遍历 public static void recursionPreorderTraversal(TreeNode root) { if (root != null) { System.out.print(root.val + " "); recursionPreorderTraversal(root.left); recursionPreorderTraversal(root.right);

qq_43170213的博客 3510

LeetCode 二叉树的前序 中序 后序 层序遍历 递归算法 迭代算法 C++

二叉树的前序遍历 给定一个二叉树,返回它的 前序 遍历。 示例: 递归算法: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { pub

ZYYRWish_97的博客 1145

二叉树的递归与非递归方式的先序、中序、后序、层序遍历算法(Java版本)

介绍 本文提供了二叉树的构造、递归与非递归方式的遍历算法,其中递归方式较为简单。但在实际应用中,递归的遍历方式适用于递归深度不高的算法中,其一般使用非递归方式来解决。 二叉树建树 实验一:输入测试数据序列:A B # D # # C # # 构造二叉树示意图: 非递归遍历二叉树的原理 递归方式遍历二叉树较为简单,本文不做过多描述。非递归方式需要用到栈作为辅助数据结构来实现,非递归遍历二叉...

qq_25956141的博客 2112

面试算法 二叉树的遍历,方法递归,前序遍历: 中序遍历: 后序遍历: 层序遍历

二叉树遍历 前序遍历:根左右 中序遍历:左根右 后序遍历:左右根 层序遍历:从上往下、从左往右 递归遍历:使用递归方法遍历

she666666的博客 314

二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法

本文对二叉树的前序遍历、中序遍历、后

bbewx的专栏 1167

二叉树前序遍历、中序遍历、后序遍历递归以及非递归算法详解以及代码整合

引文 对二叉树的前中后序递归以及非递归算法以及层序遍历思想做了整合 因为某些书籍上对这类算法,写的非常笼统,所以,这里将从树的链式存储开始,结合整个 链表、栈、队列等结构来完成对树的学习,当然,这里也将会完美的列出所用的栈、队列等结构,直接复制代码即可运行。 说明:下面代码 在定义的时候可能不会遵循一般的编程规范,比如这些愚蠢的结构体的名字(因为这就是为了考试用的)。请已经工作了的童鞋理解(虽然我自己都非常想吐槽)

朱子恒的博客 2064

建立二叉树,实现二叉树的先序遍历、中序和后序遍历的非递归算法

先序遍历:若二叉树为空,则空操作;否则访问根节点;先序遍历左子树;先序遍历右子树。 中序遍历:若二叉树为空,则空操作;否则中序遍历左子树;访问根节点;中序遍历右子树。 后序遍历:若二叉树为空,则空操作;否则后序遍历左子树;后序遍历右子树;访问根节点。/* * Created by Microsoft Visual Studio 2013 * @author: Teresa * @date: 20

Teresa0312的博客 4714

数据结构与算法二叉树的三种递归遍历算法 前序遍历 中序遍历 后序遍历

数据结构与算法二叉树的三种递归遍历算法 前序遍历 中序遍历 后序遍历

c673929079的博客 972
上一篇: 二叉树前序遍历的递归与非递归算法
下一篇: 图的最小生成树prim算法总结
ZengBlog
博客等级 码龄10年 29粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值