94-二叉树的中序遍历

Leetcode——94,二叉树中序遍历 /** * \* Created: liuhuichao * \* Date: 2019/7/16 * \* Time: 31:57 PM * \* Description:二叉树的中序遍历 : 中序遍历是先遍历左子树,然后访问根节点,然后遍历右子树 * \ * 给定一个二叉树,返回它的中序 遍历。 * <p> * 示例: * <p> * 输入... 阅读详情

题目

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

输入:root = [1,2]
输出:[2,1]

示例 5:

输入:root = [1,null,2]
输出:[1,2]

题解一 递归

class Solution {
    List<Integer> res;
    public List<Integer> inorderTraversal(TreeNode root) {
        res=new ArrayList<>();
        if(root==null){
            return res;
        }
        inOrder(root);
        return res;
    }
    private void inOrder(TreeNode root){
        if(root==null){
            return;
        }
        inOrder(root.left);
        res.add(root.val);
        inOrder(root.right);
    }
}

//官方题解 中序遍历的时候用递归一般返回都是void,注意这点
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        inorder(root, res);
        return res;
    }

    public void inorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        inorder(root.left, res);
        res.add(root.val);
        inorder(root.right, res);
    }
}

题解二 迭代

public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        // 栈 先进后出
        // 前序遍历,出栈顺序:根左右; 入栈顺序:右左根
        // 中序遍历,出栈顺序:左根右; 入栈顺序:右根左
        // 后序遍历,出栈顺序:左右根; 入栈顺序:根右左
        List<Integer> ans = new ArrayList<Integer>();
        Stack<TreeNode> stack = new Stack<>();
        // root为空且stack为空,遍历结束
        while (root != null || !stack.isEmpty()) {
            //注意是||,只要有一个满足条件即可!
            // 先根后左入栈
            
            //不断往左子树方向走,每走一次就将当前节点保存到栈中
			//这是模拟递归的调用
            while (root != null) {
                stack.push(root);//优先一直遍历左节点直到不能遍历为止!
                root = root.left;
                //当前节点为空,说明左边走到头了,从栈中弹出节点并保存
				//然后转向右边节点,继续上面整个过程             
            }
            // 此时root==null,说明上一步的root没有左子树
            // 1. 执行左出栈。因为此时root==null,导致root.right一定为null
            // 2. 执行下一次外层while代码块,根出栈。此时root.right可能存在
            // 3a. 若root.right存在,右入栈,再出栈
            // 3b. 若root.right不存在,重复步骤2
            root = stack.pop();//修改根!!!
            ans.add(root.val);//出栈时再记录!
            root = root.right;
        }
        return ans;
    }
}

笔记:

  1. 迭代的遍历用栈维护。先根节点入栈,然后左节点,最后右节点。先左边循环入,入到没有左为止,然后弹出,出值,指向右。

题解三 Morris 中序遍历

class Solution {
	public List<Integer> inorderTraversal(TreeNode root) {
		List<Integer> res = new ArrayList<Integer>();
		TreeNode pre = null;
		while(root!=null) {
			//如果左节点不为空,就将当前节点连带右子树全部挂到
			//左节点的最右子树下面
			if(root.left!=null) {
				pre = root.left;
				while(pre.right!=null) {//找到左节点的最右子树
					pre = pre.right;
				}
				pre.right = root;
				//将root指向root的left
				TreeNode tmp = root;
				root = root.left;
				tmp.left = null;//为什么不能直接置null?
			//左子树为空,则打印这个节点,并向右边遍历	
			} else {
				res.add(root.val);
				root = root.right;
			}
		}
		return res;
	}
}

笔记:

  1. 将非递归的中序遍历空间复杂度降为O(1)
  2. 将二叉树化解成一条链表,顺序遍历。

  3. 对于二叉树中的所有的节点, 1 如果它的左子树为空,那么也就是说该节点的前驱就是她自身。 2 如果它的左子树不空。那么利用文中的for语句来找到当前节点的前驱节点。如果找到之后,根据该前驱节点的右指针是否为空,来决定是加线索还是去掉线索。

  4. 看根节点是否有左子树,如果没有则直接打印该节点并向右遍历,若有的话找到左子树的最右节点pre,将根节点挂到pre上。

5.44GHz超高精度!STM32G474的HRTIM时钟配置避坑指南 本文深入解析STM32G474内置高分辨率定时器的时钟配置要点,帮助工程师避开常见陷阱。文章详细阐述了从系统时钟到5.44GHz等效时基的路径,重点分析了预分频器乘法器、周期计算溢出、影子寄存器同步等关键配置,并结合实测波形对比,确保HRTIM在电机控制、数字电源等精密应用中发挥极限性能。 阅读详情

相关推荐

从碰撞电离到雪崩击穿:Sentaurus仿真中的模型选择与验证艺术

本文深入探讨了Sentaurus TCAD中雪崩击穿模型的选取与验证方法,特别关注平行平面结的仿真实践。通过对比Chynoweth、van Overstraeten等主流模型的适用场景与精度差异,结合具体案例展示了从几何建模到边界条件设定的完整验证流程,并针对非理想因素提供了有效的补偿技术,助力工程师提升器件仿真的准确性与可靠性。

weixin_29074295的博客 593

leetcode94. 二叉树的中序遍历

1.题目描述: 给定一个二叉树的根节点root,返回它的中序遍历。 2.递归中序遍历: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * Tr.

kkkkuuga的博客 1177

LVGL字体优化实战:如何将中文字库放到外部SPI Flash并动态加载(节省内部RAM)

本文详细介绍了LVGL在嵌入式UI开发中如何通过外部SPI Flash存储中文字库并动态加载,以节省内部RAM资源。通过对比不同存储介质和字库格式,提供多种实现方案及性能优化技巧,帮助开发者在资源受限设备上实现高效的中文显示。

weixin_28693683的博客 348

94. 二叉树的中序遍历

题目: 94. 二叉树的中序遍历 题解: 1. 递归中序遍历 第一种解决方法是使用递归。这是经典的方法,直截了当。我们可以定义一个辅助函数来实现递归。 2. 迭代中序遍历 考查到当前节点时,并不直接输出该节点。 而是当考查节点为空时,从栈中弹出的时候再进行输出(永远先考虑左子树,直到左子树为空才访问根节点)。 代码: 1. 递归法: // 解法一:递归 public static......

dev_zyx的博客 6343

别再死记硬背了!用Wireshark抓包实战,5分钟搞懂GRE、L2TP、IPsec的区别

本文通过Wireshark抓包实战,详细解析GRE、L2TP和IPsec三大隧道协议的核心差异与应用场景。从报文结构到配置示例,帮助网络工程师快速掌握这些协议的本质,提升VPN部署与故障排查能力。特别适合准备HCIP认证的工程师深化理解。

weixin_30352645的博客 439

STM32按键中断切换红绿蓝灯

通过以上步骤,我们实现了使用STM32的按键中断来切换红绿蓝LED灯的功能。在实际应用中,可能还需要考虑更多的细节,如按键消抖、更精确的延时实现等。但上述代码提供了一个基本的框架和思路,可以根据具体需求进行扩展和优化。希望这篇博客对您有所帮助!

2301_79865940的博客 952

LeetCode第94题_二叉树的中序遍历

给定一个二叉树的根节点root,返回它的遍历。

qq_40263592的博客 1307

海康visionmaster开发笔记10-集成HALCON第三方算子到VM工具箱的方法

海康visionmaster开发笔记10-HALCON第三方算子到VM工具箱的方法

视觉人机器视觉的博客 4349

LeetCode 94二叉树的中序遍历

LeetCode 94二叉树的中序遍历 题目简述:给定一个二叉树,返回它的中序遍历。 输入:[1,null,2,3] 输出: [1,3,2] 思路:递归 class Solution { public: vector<int> res; void dfs(TreeNode *root) { if(!root) return; dfs(root->left); res.push_back(root->va

XBlog 237

热红外图像小目标检测算法综述

热红外小目标检测算法综述,着重介绍基于深度学习的小目标检测算法

Littro Innovations 4245

第1.2章 机器人SLAM计算机基础总结(二):VSCode教程及 AI等效率插件推荐

如何高效编写代码?怎样快速调试程序?**别担心,今天就给大家带来一款超强大的编程神器 ——VSCode,以及能让编程之路 “一马平川” 的实用插件推荐,无论你是新手小白还是资深大神,都能从中受益!

行知SLAM 1866

LeetCode-94. 二叉树的中序遍历

LeetCode-94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 思路 分为递归版本和非递归版本。 递归 /** * Definition for a binary tree node. * public class TreeNode { * ...

Galip的博客 324

【CANoe】CAPL_ECU上电后首帧报文发出时间检测

【CANoe】CAPL_ECU上电后首帧报文发出时间检测,通过CANoe I/O口检测电压实现

星Yeah 的博客 2512

LeetCode94-二叉树的中序遍历

LeetCode94-二叉树的中序遍历 最近全国疫情严重,待在家里没事干,马上又要准备春招了,最近刷刷题,记录一下!再说一句,武汉加油,大家出门记得戴口罩! 1、题目 给定一个二叉树,返回它的中序遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 2、思路 基于递归...

sk18192449347的博客 307

lwip-2.0.3

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

温度PID控制PLC程序

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

LeetCode 94. 二叉树的中序遍历

题目链接:LeetCode 94. 二叉树的中序遍历 给定一个二叉树,返回它的中序遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 解题思路: 递归的方式,进行中序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode...

error311的博客 139

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LeetCode 94:二叉树的中序遍历

LeetCode 94:二叉树的中序遍历 题目描述解题思路代码实现总结 题目描述 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 解题思路 二叉树的中序遍历:left -->root–>right (左跟右),借助栈结构,我们将每个按顺序遍历的节点,添加到arraylist当中。从二叉树的根节点开始,先将根节点...

香农三定律的博客 174

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

力扣94题:二叉树的中序遍历

方法时间复杂度空间复杂度特点递归OnO(n)OnOhO(h)Oh简单易实现,但依赖递归栈。迭代(栈)OnO(n)OnOhO(h)Oh显式使用栈,适合较大的二叉树。Morris 遍历OnO(n)OnO1O(1)O1无额外空间需求,但实现较复杂。不同方法适合不同场景,推荐优先使用递归和迭代方法,Morris 遍历适合对空间要求极高的情况。

weixin_48941116的博客 1097

leetcode 94——二叉树的中序遍历

leetcode 94——二叉树的中序遍历 题目描述: 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal 著作权...

weixin_44795839的博客 225

LeetCode 94.二叉树的中序遍历

LeetCode 94.二叉树的中序遍历 一、题目详情 原题链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 给定一个二叉树的根节点 root ,返回它的 中序 遍历。 示例1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 示例 4: 输入:root = [1,2] 输出:[2,1] 示

jrrhjww的博客 70

LeetCode94. 二叉树的中序遍历

LeetCode94. 二叉树的中序遍历 给定一个二叉树的根节点root,返回它的中序遍历。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围[0, 100]内-100 <= Node.val <= 100 树的中序遍历,递归: 1. 若根节点为空,直接返回 2. 若...

u011485472的博客 226

【小白爬Leetcode94】二叉树的中序遍历 Binary Tree Inorder Traversal

【小白爬Leetcode94】二叉树的中序遍历 Binary Tree Inorder Traversal题目方法一 递归方法二 循环 题目 Leetcode94 medium\color{#ffaa00}{medium}medium 点击进入原题链接:二叉树的中序遍历 Binary Tree Inorder Given a binary tree, return the inorder traversal of its nodes’ values. 方法一 递归 最朴素的递归,如果可以用递归这道

weixin_41604040的博客 198

LeetCode94. 二叉树的中序遍历Golang版

LeetCode94. 二叉树的中序遍历Golang版 1. 问题描述 给定一个二叉树的根节点 root ,返回它的 中序 遍历。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 示例 4: 输入:root = [1,2] 输出:[2,1] 示例 5: 输入:root = [1,null,2] 输出:[1,2] 提示: 树中节点数目在范围 [0, 100] 内 -100 &

菜到不敢run 371
上一篇: 79-单词搜索
下一篇: 96-不同的二叉搜索树
codrab
博客等级 码龄10年 15粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codrab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值