94-二叉树的中序遍历

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

题目

给定一个二叉树的根节点 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上。

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

相关推荐

计算机组成原理实验二 运算器组成实验

事实上,ALU的设计是在全加器的基础上,对全加器功能的扩展来实现符合要求的多种算术/逻辑运算的功能。为了实现多种功能的运算,An、Bn数据是不能直接与全加器相连接的,它们受到功能变量F3—F1的制约,因此,可由An、Bn数据和功能变量F3-F1组合成新的函数Xn 、Yn,然后,再将Xn 、Yn和下一位进位Cn-1通过全加器进行全加运算以实现所需的运算功能。AC寄存器可用来存储ALU的输入以实现两个操作数的运算操作,也可以用来存储来自ALU的结果,以将这些结果反馈给ALU以进行更多的处理。

qq_63574533的博客 1430

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的博客 1173

Python自动化监控:实时捕捉LOF基金溢价套利机会并微信预警

本文详细介绍了如何使用Python构建一个自动化监控系统,实时捕捉LOF基金的溢价套利机会。通过AKShare获取基金数据,结合雪球API计算实时溢价率,并利用企业微信API实现微信推送预警,帮助投资者高效、自动地发现并抓住转瞬即逝的套利机会。

weixin_28327051的博客 495

94. 二叉树的中序遍历

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

dev_zyx的博客 6329

LeetCode94题_二叉树的中序遍历

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

qq_40263592的博客 1293

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 234

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

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

Galip的博客 319

LeetCode94-二叉树的中序遍历

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

sk18192449347的博客 302

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的博客 136

LeetCode 94二叉树的中序遍历

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

香农三定律的博客 167

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

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

weixin_48941116的博客 1095

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的博客 218

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的博客 67

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的博客 224

【小白爬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 368
上一篇: 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、付费专栏及课程。

余额充值