每日算法 - 二叉树中序遍历(基础算法)

牛客每日一题:二叉树层序遍历变种题解析 二叉树层序遍历是算法学习中的基础内容,通过队列实现广度优先搜索是其核心原理。在实际工程应用中,这种算法常用于文件系统遍历、网络爬虫等场景。牛客网的每日一题栏目特别设计了层序遍历的变种题型,要求同步记录节点深度并按特定格式输出,这既考察了基础算法掌握度,又检验了工程实践中处理边界条件的能力。解题时可采用双队列法分别存储节点和深度信息,这种方法虽然增加了空间复杂度,但显著提升了代码可读性和容错率。对于准备校招的开发者而言,掌握此类高频考点题目能有效提升笔试通过率,同时培养防御性编程意识。 阅读详情

目录

题目

解题思路

中序遍历代码

递归(最基础)

栈

莫瑞斯

总结

完整测试代码



题目

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

示例:

输入: [1,null,2,3]
   1
    \
     2
    /
   3

输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题思路

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/er-cha-shu-de-zhong-xu-bian-li-by-leetcode/

 

 


中序遍历代码

  • 递归(最基础)

public List < Integer > inorderTraversal(TreeNode root) {
        List < Integer > res = new ArrayList < > ();
        helper(root, res);
        return res;
    }

    public void helper(TreeNode root, List < Integer > res) {
        if (root != null) {
            // 左
            if (root.left != null) {
                helper(root.left, res);
            }
            // 根
            res.add(root.val);
            // 右
            if (root.right != null) {
                helper(root.right, res);
            }
        }
    }

 


  • 栈

public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode curr = root;
        while (curr != null || !stack.isEmpty()) {
            while (curr != null) {
                stack.push(curr);
                curr = curr.left;
            }
            curr = stack.pop(); 
            res.add(curr.val); // 先存左,然后根,最后右
            curr = curr.right;
        }
        return res;
    }


  • 莫瑞斯

  public List < Integer > inorderTraversal(TreeNode root) {
        List < Integer > res = new ArrayList < > ();
        TreeNode curr = root;
        TreeNode pre;
        while (curr != null) {
            if (curr.left == null) {
                res.add(curr.val);
                curr = curr.right; // move to next right node
            } else { // has a left subtree
                pre = curr.left;
                while (pre.right != null) { // find rightmost
                    pre = pre.right;
                }
                pre.right = curr; // put cur after the pre node
                TreeNode temp = curr; // store cur node
                curr = curr.left; // move cur to the top of the new tree
                temp.left = null; // original cur left be null, avoid infinite loops
            }
        }
        return res;
    }

 


总结

1、中序遍历: 左 - 中 - 右;

2、三种方法掌握最基础的递归,能够使用栈,了解使用莫瑞斯;

 


完整测试代码

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

/**
 * 前序遍历
 */
public class InorderTraversal {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        root.setLeft(new TreeNode(0));
        root.setRight(new TreeNode(2));
        root.getRight().setLeft(new TreeNode(3));
        root.getRight().setRight(new TreeNode(0));

        // 递归实现
        List<Integer> res = inorderTraversalByRecursive(root);

        // 迭代实现
        List<Integer> res2 = inorderTraversal(root);

        // Morris实现
        List<Integer> res3 = inorderTraversalByMorris(root);

        System.out.println("递归实现:");
        for (Integer item : res) {
            System.out.print(item + " ");
        }

        System.out.println(" ");
        System.out.println("迭代实现:");
        for (Integer item : res2) {
            System.out.print(item + " ");
        }

        System.out.println(" ");
        System.out.println("Morris实现:");
        for (Integer item : res2) {
            System.out.print(item + " ");
        }
    }

    /**
     * 迭代使用栈,中序遍历
     *
     * @param root
     * @return
     */
    public static List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode curr = root;
        while (curr != null || !stack.isEmpty()) {
            while (curr != null) {
                stack.push(curr);
                curr = curr.left;
            }
            curr = stack.pop();
            res.add(curr.val); // 先存左,然后根,最后右
            curr = curr.right;
        }
        return res;
    }

    /**
     * 递归
     */

    public static List<Integer> inorderTraversalByRecursive(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        helper(root, res);
        return res;
    }

    public static void helper(TreeNode root, List<Integer> res) {
        if (root != null) {
            // 左
            if (root.left != null) {
                helper(root.left, res);
            }
            // 根
            res.add(root.val);
            // 右
            if (root.right != null) {
                helper(root.right, res);
            }
        }
    }


    /**
     * Morris
     */

    public static List<Integer> inorderTraversalByMorris(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        TreeNode curr = root;
        TreeNode pre;
        while (curr != null) {
            if (curr.left == null) {
                res.add(curr.val);
                curr = curr.right; // move to next right node
            } else { // has a left subtree
                pre = curr.left;
                while (pre.right != null) { // find rightmost
                    pre = pre.right;
                }
                pre.right = curr; // put cur after the pre node
                TreeNode temp = curr; // store cur node
                curr = curr.left; // move cur to the top of the new tree
                temp.left = null; // original cur left be null, avoid infinite loops
            }
        }
        return res;
    }

}

 

输入如题,null用0代替。输出如下:

 

递归实现:
0 1 3 2 0  
迭代实现:
0 1 3 2 0  
Morris实现:
0 1 3 2 0 

 

 

华为海思IC笔试通关秘籍:物理/电路/工艺三大方向高频考点解析(附真题) 本文深度解析华为海思IC笔试中物理设计、电路设计和工艺制造三大方向的高频考点与备考策略。针对华为海思IC笔试机考的特点,提供了方向选择建议、核心知识梳理及真题实战技巧,帮助考生构建系统性复习框架,高效备战,提升通关成功率。 阅读详情

相关推荐

[ensp报错:USG6000V错误代码45解决方案]

[ensp报错:USG6000V:错误代码45解决] [ensp报错:USG6000V:错误代码45解决] 第一种处理方式: ensp的45错误帮助文档里的解决方法:(这里就不说了,上华为爸爸的图) ensp的45错误:如果你的45错误不是描述的那个,可能是ensp与virtualbox不兼容了。 错误描述:具体表现为在virtualbox里没有vfw_usg的条目,虚拟介质管理器里也没有相应的条目: 就是vfw_usg_vdi这个 这种情况下你把ensp卸载重装多少次都没用,原因在两个软件的兼容

weixin_45456536的博客 3万+

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

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

sunnyoldboy博客 2万+

【低轨】Starlink星链-Ku波段OFDM信号同步机制与PNT应用潜力

本文深入解析了Starlink星链Ku波段OFDM信号的同步机制及其在定位、导航与授时(PNT)领域的应用潜力。研究发现,其信号帧内嵌的同步序列具有相位恒定特性,支持超长相干积分,可在极低信噪比下实现高精度伪距测量,为利用低轨卫星通信信号实现高精度PNT服务提供了新的技术路径。

weixin_29250403的博客 730

二叉树的中序遍历算法

二叉树的中序遍历算法

fly_view的博客 3346

别再只盯着时序了!聊聊SDC里那些容易被忽略的‘配角’命令:工作条件、线载模型与面积约束

本文深入探讨了SDC(设计约束)中常被忽视的关键命令,包括set_operating_conditions、set_wire_load_model和set_max_area。这些‘配角’命令在芯片设计中扮演着至关重要的角色,影响时序收敛、功耗和面积优化。文章通过实际案例和最佳实践,揭示了如何正确配置工作条件、选择线载模型以及动态调整面积约束,以提升设计质量和效率。

weixin_26875109的博客 208

Python自动化批量识别化学分子结构——从图片到SMILES/SDF的实战指南

本文提供了使用Python自动化批量识别化学分子结构图片的实战指南。详细对比了基于Molvec API的在线快速方案与本地部署OSRA工具的两种路径,包含完整的代码示例、环境配置及优化技巧,帮助化学研究者高效地将图片批量转换为SMILES或SDF格式,显著提升数据处理效率。

apple5的专栏 942

二叉树的中序遍历(三种方法)

本文详细介绍了二叉树的三种遍历方法(递归,迭代,Morris),每一种遍历方式都有保姆级的思路讲解,还有完整代码(带有注释),还不赶紧点进来学习!!!

yourgrandfather_的博客 5184

uniapp - 获取设备麦克风权限+麦克风设备列表,用户可选择切换麦克风设备功能,选择麦克风采集设备后点击录制音频外部声音+可随时暂停/继续录音+记录音频录制时长(支持在线播放试听或下载MP3文件)

uniapp获取麦克风设备列表,uniapp录制声音,Uniapp获取麦克风权限,uniapp苹果ios安卓app获取麦克风设备列表,Uniapp H5获取浏览器麦克风并实现录音,Uniapp实现麦克风权限管理与音频录制全流程,uni-app实战案例:实现H5页面麦克风权限获取与录音功能,uni-app音频录制,uniapp麦克风授权窗口,uniapp获取iOS麦克风权限,实现前端录音并播放,把音频传给后端接口处理,获取麦克风并实现录音功能,前端获取/切换麦克风播放采集音频和采集音量大小,前端调用麦克风实现

🏆 前端领域优质创作者 2981

二叉树中序遍历的三种方法

二叉树是一种重要的数据结构,对于二叉树的遍历也很重要。这里通过三种方法简单介绍一下二叉树的中序遍历。中序遍历就是先遍历二叉树的左子树,然后遍历根节点,最后遍历右子树。例如下面的二叉树,中序遍历的结果如下:[5,10,6,15,2]对于中序遍历,直观上的结果就是将二叉树所有节点投影到下面的一条直线上,得到的顺序就是二叉树的中序遍历结果。1、递归法递归方法是最容易想到的方法。递归调用遍历方法先遍历左子

Valineliu 12万+

网红商品数据抓取:基于Python的高效爬虫实战

本篇博客介绍了从爬取到存储、分析和可视化网红商品数据的完整流程。通过Python的强大生态,我们能够轻松完成复杂的数据抓取任务。在实际应用中,还可以将此爬虫与机器学习模型结合,进一步挖掘数据价值。

2201_76125261的博客 1476

YOLO26涨点改进 | 检测头Head创新改进篇 | 利用DynamicConv高效动态卷积改进YOLO26检测头,DyHead通过增强检测头操作,轻量化改进、提高模型目标检测的精度

YOLO26作为新一代轻量化目标检测模型的代表,凭借精简的Backbone架构、高效的特征融合 Neck 设计,在实时检测场景(如嵌入式设备、边缘计算)中展现出优异的性能,成为工业落地与科研入门的优选模型。但在实际应用中,YOLO26原生检测头仍存在核心瓶颈:采用固定参数卷积核,无法根据输入特征的目标尺度、纹理差异动态调整卷积权重,导致多尺度目标适配不足、复杂背景下特征利用率低,且传统改进方案往往难以平衡“精度提升”与“轻量化”,要么精度提升有限,要么大幅增加参数量、拖累推理速度。

qq_36130719的博客 370

二叉树双序遍历

所谓二叉树的双序遍历就是,对于二叉树的每个节点来说,先访问该节点,再按照这种方式访问左子树,再访问该节点,再按照双序遍历访问右子树。 该方法其实是对前序遍历进行了改变,多增加了一次访问节点函数的调用。 代码如下: #include <iostream> using namespace std; typedef struct BTNode { char data; BTNode *l_child; BTNode *r_child; } BTNode; void Dou

qq_42169456的博客 4050

selenium绕过检测,规避检测

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined或者为false。而使用selenium访问则该值为true。那么如何解决这个问题呢?我们正常浏览器登录查看,window.navigator.webdriver的值为false我们通过selenium打开的网页,测试,可见window.navigator.webdriver的值为true。

景天科技苑 1万+

五月刷题17——广度优先搜索

广度优先搜索

MYuertt9的博客 170

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

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

IDEA的使用指南

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

【小Y学算法】⚡️每日LeetCode打卡⚡️——25.二叉树的中序遍历

算法题打卡:二叉树的中序遍历。没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。所以说,树倒了,没有一片雪花是无辜的

努力前行,总会成为自己心中的那道光 9896

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【leetcode刷题】22.二叉树的中序遍历——Java版

欢迎订阅《leetcode》专栏

公号:一条coding 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【每日OJ —— 94. 二叉树的中序遍历】

每日OJ —— 94. 二叉树的中序遍历

qq_73900397的博客 908

【每日算法】

算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归)

walk on the air 的博客 1821

每日一题——二叉树的中序遍历

菜鸡每日一题系列打卡94天每天一道算法题目小伙伴们一起留言打卡坚持就是胜利,我们一起努力!题目描述(引自LeetCode)给定一个二叉树,返回它的中序遍历。示例: 输入: [1,nul...

W_J_G_的博客 655

【每日刷题】二叉树的中序遍历

题目地址 https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 题目描述:二叉树的中序遍历 给定一个二叉树,返回它的中序遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 解答 树的有多种遍历方式:层次遍历 + 前/中/后序遍历。 前/中/后序遍历...

grefwfdxz 506

每日一题——二叉树的层序遍历

菜鸡每日一题系列打卡102天每天一道算法题目小伙伴们一起留言打卡坚持就是胜利,我们一起努力!题目描述(引自LeetCode)给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地...

W_J_G_的博客 296

【每日一题】力扣102 二叉树的层序遍历

前言 停更几个月了,发现自己的自律能力还是挺差的,所以现在我想到了一个新招:每日一题。很多博主都搞了这一系列,其实挺不错的,可以约束自己。后面多多指教啦! 文章目录题目解题思路代码(C++)总结 题目 题目链接:力扣102:二叉树的层序遍历 给你二叉树的根节点 root,返回其节点值的层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root =

倾心之作 1790

【算法通关指南:数据结构与算法篇 】二叉树相关算法题:1.新二叉树 2.二叉树的遍历

摘要: 本文介绍了两个二叉树相关算法题:《新二叉树》和《二叉树的遍历》。在《新二叉树》中,通过ASCII码值映射节点建立二叉树,并实现先序遍历;《二叉树的遍历》则通过链式存储和深度优先搜索(DFS)完成前序、中序和后序遍历。代码简洁高效,适合算法初学者练习。文章强调以实战提升算法能力,鼓励读者坚持学习,相信努力终会收获成长。 关键词: 二叉树、先序遍历、DFS、算法实战、代码实现

小龙报的博客 1189

二叉树的层序遍历

今天来看一道二叉树的高频面试题,在面试中,对于树的考核基本上就是针对二叉树的一些操作了,比如:二叉树的前序、中序、后序、层序遍历,镜像二叉树,对称二叉树,二叉树的第一个公共父节点,二叉树的深度的等等。因此,平时碰上二叉树的题就要多留意一下。 题目描述   输出一棵二叉树层序遍历的结果。 思路   层序遍历就是从上往下按顺序依次遍历一棵树。按顺序也就是先进先出的规律,因此可以借助一个辅助队列,首先将根节点加入队列,然后循环判断队列是否为空,在队列不为空的情况下,首先访问队列的首元素,随后将首元素出列,如果左右

Mr Liu的博客 2651

每日算法 - 二叉树的层序遍历

目录 题目 解题思路 代码 鉴于找实习那么打脑壳,今天晚上再写一道题吧。。。 题目 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例: 二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20],...

Longtermevolution的博客 279

每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树

👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。这是一道力扣的中等题,总的来说也并不算很难,理解掌握对前序遍历与中序遍历递归构建的过程才是最重要的。🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉。

欢迎来到阿熊的blog~~ 619
上一篇: 每日算法 - 二叉树前序遍历(基础算法)
下一篇: 每日算法 - 设计循环队列(基础算法)
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值