二叉树中序遍历,非递归与递归

LeetCode 二叉树的中序遍历(递归和非递归算法) 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 思路分析:二叉树的遍历有先序遍历、中序遍历、后序遍历、层次遍历。 先序遍历:先访问根节点,然后访问左子树,再访问右子树。 中序遍历:先访问左子树,然后访问根节点,再访问右子树。 后序遍... 阅读详情

题目:牛客网

解题思路:

非递归借用栈  

非递归: 

import java.util.ArrayList;
import java.util.Stack;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ArrayList<Integer> inorderTraversal(TreeNode root) {
		ArrayList<Integer> res = new ArrayList<Integer>();
		Stack<TreeNode> stack = new Stack<TreeNode>();
        if(null == root)
        	return res;
        TreeNode p = root;
        while(!stack.isEmpty()|| p!=null){
        	while(p != null){
            	stack.add(p);
            	p = p.left;
            }
        	TreeNode current = stack.pop();
        	res.add(current.val);
        	p = current.right;
        }
        return res;
    }
}

 递归:

 

import java.util.ArrayList;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ArrayList<Integer> inorderTraversal(TreeNode root) {
		ArrayList<Integer> res = new ArrayList<Integer>();
		if(null == root)
			return res;
		if(null != root.left){
			res.addAll(inorderTraversal(root.left));
		}
		res.add(root.val);
		if(null != root.right){
			res.addAll(inorderTraversal(root.right));
		}
		return res;
    }
}

 

 

不用栈,来实现二叉树的非递归中序遍历 如果要求只能用非递归方法,同时还不让用栈,来遍历完全二叉树,则每个结点必须有一个指向父结点的指针。 题目: 完全二叉树,采用三叉链表结构。 要求 不用递归,中序遍历这棵树。要求空间复杂度是O(1). 分析:题目不让用递归,那就用迭代,同时,空间复杂度是常量级,摆明了不让用栈。 那就必须是三叉链表了。三叉链表是二叉树的另一种主要的链式存储结构。三叉链表与二叉链表的主要区别在 阅读详情

相关推荐

STM32CubeIDE离线安装芯片PACK包全攻略(附离线包下载与导入步骤)

本文详细介绍了在STM32CubeIDE中离线安装芯片PACK包的完整流程,包括官方和第三方资源获取方法、本地安装步骤及常见问题解决方案。特别针对网络隔离环境下的嵌入式开发需求,提供了实用的版本管理和自动化部署技巧,帮助开发者高效完成芯片固件支持包的离线配置。

weixin_30825581的博客 298

二叉树的中序非递归遍历

二叉树的中序非递归遍历 中序遍历的非递归算法描述如下: 从根节点开始检索,如果当前节点不为空,则将当前节点入栈,让当前节点成为其左孩子节点,再继续上一步的操作 加入当前节点为空了,说明其父节点已经没有左孩子了,那么将栈顶元素出栈并输入 判断栈顶元素是否有右孩子,如果有右孩子,则停止依次继续出栈的操作,并检索它的右孩子,重复第一步;如果没有右孩子,则继续将栈顶元素出栈 当栈为空,并且当前节点为空时,遍历完成,退出; #include<stdio.h> #include<stdlib.h&

weixin_45863060的博客 8773

Intel RealSense D435深度相机实战:从数据采集到点云生成的完整避坑指南

本文详细介绍了Intel RealSense D435深度相机的实战应用,从数据采集到点云生成的完整流程,并提供了避坑指南。内容包括环境配置、硬件调优、数据采集技巧、点云生成核心技术及典型场景解决方案,帮助开发者高效利用D435进行机器人导航、三维重建等应用。

weixin_29054195的博客 471

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

中序遍历的原理很简单,也就是把树根的访问放在中间。访问结点的次序是:“左—>根—>右”,也就是首先访问左子树,之后访问树根,最后访问右子树。对于左、右子树而言,其访问的次序依然是“左—>根—>右”。 不要小看这里的次序发生的改变,其实具体的实现方式比先序遍历也要麻烦了。 二叉树的中序遍历与先序遍历一样,都可以通过递归算法实现,也可以通过非递归算法实现。......

sunnyoldboy博客 2万+

【没有网络,安装python包】如何从 PyPI 下载并安装 Plotly 的离线包

在某些情况下,您可能需要在没有互联网连接的环境中安装 Python 包,例如在飞机上、在某些受限制的网络环境中或在需要离线安装的场景下。以下是如何在 PyPI(Python Package Index)下载 Plotly 包并进行离线安装的详细步骤。

赖德发的博客 1102

Adams二次开发实战指南:从CMD到Python与插件开发全解析

本文全面解析Adams二次开发的三种核心方法:CMD命令、Python脚本和C++插件开发。通过实战案例展示如何实现参数批量修改、自动化仿真流程和定制功能开发,显著提升多体动力学仿真效率。特别适合需要处理复杂建模和重复性任务的工程师学习参考。

weixin_29235923的博客 125

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

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

weixin_44462351的博客 7126

把 300 亿参数的 Qwen3-30B-A3B 塞进 16GB 手机:MoE、mmap 与内存轮转的完整拆解

这篇文章详细拆解了如何在16GB内存手机上运行305亿参数的Qwen3-30B-A3B大模型。作者通过MoE(专家混合)架构、内存映射(mmap)和专用NPU内存(rpcmem)的巧妙结合实现了这一"不可能"的任务。 核心原理在于:MoE模型将庞大的前馈网络拆分为128个专家,每个词只激活8个专家,97%的权重处于闲置状态;通过mmap技术按需加载当前需要的专家权重;同时利用NPU专用内存高效计算关键部分。三个关键开关(GGML_HEXAGON_MOE_PAGING=1、--mmap、GGML_CPU_RE

q742971636的博客 185

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

*非递归算法思想:    (1)设置一个栈S存放所经过的根结点(指针)信息;初始化S;   (2)第一次访问到根结点并不访问,而是入栈;    (3)中序遍历它的左子树,左子树遍历结束后,第二次遇到根结点,就将根结点(指针)退栈,并且访问根结点;然后中序遍历它的右子树。   (4) 当需要退栈时,如果栈为空则结束。           代码实现: void ...

Billy1900的博客 4万+

手把手教你学SIMULINK模块库文件专栏-From Workspace 模块详解

模块是 Simulink 中的一个信号源模块,用于从 MATLAB 工作区加载数据作为输入信号。该模块允许用户将预先在 MATLAB 中生成的数据(如时间序列、矩阵或结构体)导入到 Simulink 模型中,从而实现更灵活的信号输入和仿真控制。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常灵活的工具,适用于需要从 MATLAB 工作区加载数据的各种场景。

MHD0815的博客 631

【AI智能体】Claude Code 高级编程技巧实战项目详解

Claude Code 高级编程技巧实战项目详解

congge 1万+

二叉树三种非递归遍历

二叉树三种非递归遍历王道书思想方法实现

qq_52526050的博客 3394

18006.STM32通过SPI读取LAN9253数据

【代码】18006.STM32通过SPI读取LAN9253数据。

写给自己的笔记 552

【C语言】二叉树中序遍历(递归和非递归)算法

二叉树中序遍历的实现思想是: 访问当前节点的左子树; 访问根节点; 访问当前节点的右子树; 图 1 二叉树 以图 1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 遍历节点 1 的左子树,找到节点 2; 遍历节点 2 的左子树,找到节点 4; 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树; 由于节点 4 无右子树,因此...

点滴记忆 8868

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

非递归先序遍历二叉树总结(3种方法)

算法 非递归先序遍历二叉树总结(3种方法) @author:Jingdai @date:2020.12.03 递归先序遍历二叉树非常的简单,但是面试的时候面试官经常会要求我们写非递归的方法,这里总结一下。 方法1 先写一个最简单的方法。首先回想一下层次遍历二叉树的代码,利用一个队列完成树的遍历。如下代码。 public static void levelOrderTraverse(TreeNode root) { if (root == null) return; Li

qq_41512783的博客 8008

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

二叉树先序遍历非递归遍历算法

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200822091116709.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTQ4MjQyMg==,size_16,color_FFFFFF,t_70#pic_center #include <iostream> using n

weixin_45482422的博客 4970

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

C语言实现二叉树的非递归中序遍历创建一个栈栈的操作函数怎样实现非递归中序遍历完整代码和测试结果 创建一个栈 注意,这个栈的目的时用来保存结点地址的。因为我们在出栈时,还需判断结点的右节点的情况,如果只是保存结点的值,是无法实现中序遍历的。 现在我们来创建一个栈。首先定义一个栈的结构,不过之前还需定义一个节点结构 节点定义 typedef struct BinaryTreeNode{ int data; struct BinaryTreeNode *lchild, *rchild;//左右孩子指针 }B

weixin_43744293的博客 4892

二叉树的中序遍历(非递归实现)

一、递归实现前序,序,后序遍历;对于二叉树,前面已经采用递归的方式实现的其前序,中序,后序遍历,具体请参见:http://blog.youkuaiyun.com/dai_wen/article/details/78955411那么,如何采用非递归的方式遍历树呢?下面,以实现中序遍历二叉树为主题展开:二、非递归实现 中序遍历:1,结构: 首先,对于中序遍历,我们知道,原则是先走到的结点后访问,后走到的结点

dai_wen的博客 2万+

非递归实现中序遍历二叉树

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34087503的博客 3457

(※)中序遍历二叉树的非递归算法

在此之前,我们已经学习了中序遍历二叉树的递归算法,相信大家已经将其牢牢掌握了. 除了使用递归思想作为求解问题的钥匙,还可以借助栈来以非递归方式实现该问题的求解. 首先,我们要讨论存储二叉树结点信息的栈的形态:是只存储二叉树结点的指针,还是要完整存储二叉树结点的信息(LChild指针+数据域data+RChild指针). 在这里先和大家说明,经过程...

weixin_42048463的博客 4635

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

用栈来实现二叉树中序遍历的非递归算法

mili_j的博客 4150

二叉树:中序遍历非递归与递归算法

二叉树(BiTree)的遍历分为: 先序遍历(preorder):根左右 中序遍历(inorder):左根右 后序遍历(postorder):左右根 其中,时间复杂度和空间复杂度都是O(n), 二叉树的遍历递归算法不常考,主要考察非递归❤ 先序、中序、后序遍历(递归) 递归算法的区别在于visit()函数的位置❤,代码以先序遍历为例,其顺序为根左右,if判断语句中符合这一规律,中序、后序按其左根右和左右根的规律改变这三句代码的顺序即可。 void preorder(BiTree T){ // 先序遍历递.

花间半盘棋 4886

二叉树中序遍历(递归+非递归)Java

目录一、结构二、遍历二叉树1.中序遍历(递归)代码图解2.中序遍历(非递归)代码图解新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程...

dabusiGin的博客 8629

二叉树的前中后和层序遍历详细图解(递归和非递归写法)

我家门前有两棵树,一棵是二叉树,另一棵也是二叉树。 遍历一棵二叉树常用的有四种方法,前序(PreOrder)、中序(InOrder)、后序(PastOrder)还有层序(LevelOrder)。 前中后序三种遍历方式都是以根节点相对于它的左右孩子的访问顺序定义的。例如根-&gt;左-&gt;右便是前序遍历,左-&gt;根-&gt;右便是中序遍历,左-&gt;右-&gt;根...

Monster_ii的博客 8万+

二叉树的先序遍历(非递归)

虽然递归简单理解,但是用递归内存开销大,耗时长,性能往往不如非递归方式 所以这里通过栈,用非递归方法实现二叉树的先序遍历 二叉树的存储结构定义: typedef struct node{ int data; struct node * lchild; //指向左孩子的结点 struct node * rchild; //指向右孩子的结点 }BTNode; 思路:(根 右 左,由于要使用栈,会和原本的不同) 1,定义一个栈,定义初始化。 2.判断二叉树是否为

muyu_muyu的博客 7223

c语言 二叉树先序遍历(非递归)

/*************************** * author:vivi * date: 19-09-10 ****************************/ #include <stdio.h> #include <stdlib.h> // function:直接插入排序 typedef struct BTNode { int data;...

sw520lkm的博客 6258
上一篇: minimum-window-substring
下一篇: 后序遍历
PMPWDF
博客等级 码龄10年 44粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值